问题描述
所以我需要部署一个Google Cloud函数来对PostgreSQL数据库(Cloud SQL)发出SELECT请求。我需要使用PG模块,然后使用:npm i pg安装它。您需要知道我的项目目录是这样的:
project
\_____ node_modules
\_____ src
\_____ index.js
\_____ package.json
\_____ package-lock.json
安装NPM后,使用Package-lock.json创建node_MODULES,然后自动更新Package.json依赖项。我的Package.json文件:
{
"name": "postgre-sql",
"version": "0.1.0",
"dependencies": {
"pg": "^7.12.1"
}
}
到目前为止,没有问题...
现在我编写代码并进行导出,以便在Google Cloud平台中使用我的简单代码。我使用命令行并移动到我的src目录来执行以下行:
gCloud函数部署函数NameInGCP--运行时节点js10--触发器--http--入口点函数NameInIndexJS--欧洲-西部地区1
问题是部署不起作用。
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function failed on loading user code. Error message: Provided module can't be loaded.
Did you list all required modules in the package.json dependencies?
Detailed stack trace: Error: Cannot find module 'pg'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:582:15)
at Function.Module._load (internal/modules/cjs/loader.js:508:25)
at Module.require (internal/modules/cjs/loader.js:637:17)
at require (internal/modules/cjs/helpers.js:22:18)
at Object.<anonymous> (/srv/functions/index.js:3:12)
at Module._compile (internal/modules/cjs/loader.js:701:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
at Module.load (internal/modules/cjs/loader.js:600:32)
at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
at Function.Module._load (internal/modules/cjs/loader.js:531:3)
Could not load the function, shutting down.
我已经尝试了许多解决方案来解决我的问题,我知道我可以在根目录中移动我的index.js,但我需要保留src目录。当我将它移动到根目录中时,它可以工作,但当index.js不在根目录上时,我不知道它是如何工作的。这里是我的index.js文件:
'use strict'
const pg = require('pg');
exports.select = (request, result) =>
{
console.log('On exports.select !!!');
const config =
{
host: '/cloudsql/project:region:instanceName',
user: 'user',
password: 'password',
database: 'postgres'
};
let pool = new pg.Pool(config);
pool.query('SELECT 1;', (err, res) =>
{
console.log('On query !!!');
if(err)
{
console.error(err);
result.status(500);
result.send(err);
} else
{
console.table(res.row);
result.status(200);
result.send(JSON.stringify(res));
}
});
pool.end();
console.log('Export.select is finish !');
}
因此,在我的项目中,我希望将Package.json文件保存在根目录下。然后在src目录上,我将为我的所有Google Cloud功能放置许多其他目录。例如,在src文件夹中,我将创建一个新的PostgreSQL文件夹,其中包含index.js以执行不同的操作。然后我会创建一个新的文件夹,例如,Redis文件夹,里面也有index.js:就像这样:project
\_____ node_modules
\_____ src
\_____ postgreSQL
\________ index.js
\_____ Redis
\________ index.js
\_____ package.json
\_____ package-lock.json
所以,如果我在Package.json上指定了"main":"./src/index.js",那是因为我想拥有一个main。但我不想这样,我想要一个项目文件夹,里面有我所有的Google Cloud功能。
感谢您抽出时间。
推荐答案
我刚刚复制了您的问题并找到了解决方案。感谢您提供您使用的所有代码以及对您想要实现的目标的良好描述,这真的很有帮助。
我复制了您的文件分发,并对我的Package.json进行了以下更改:
"name": "cloudfunctiontest4",
"version": "1.0.0",
"description": "",
"main": "./src/index.js",
"dependencies": {
"pg": "^7.12.1"
},
"devDependencies": {},
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"author": "",
"license": "ISC"
}
如果您指定索引使用Main的位置,则在那里部署它不会有任何问题。确保在您的src/文件夹中执行gCloud部署您的Package.json所在的位置,它使用您指定的Main来知道要使用哪个入口点。
我使用了以下gCloud命令:
gcloud functions deploy testfunction4 --runtime nodejs10 --trigger-http --entry-point select --region europe-west1
让我知道它是否对您有效。
编辑:
请看这篇文章,this可能适合您的用例。我认为我的答案是回答了您最初的问题,您添加的发展可能是新主题/问题的情况。
让我知道。
这篇关于无法在Google Cloud Function(index.js,不在项目根目录)中加载NODE_MODULES的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!