因此,我需要部署 Google Cloud Function 以在 PostgreSQL 数据库 (Cloud SQL) 上发出选择请求。我需要使用 pg 模块,然后使用以下命令安装它:npm i pg。你需要知道我的项目目录是这样的:
project
\_____ node_modules
\_____ src
\_____ index.js
\_____ package.json
\_____ package-lock.json
使用 package-lock.json 创建 npm install node_modules 后,package.json 依赖项会自动更新。我的 package.json 文件:
{
"name": "postgre-sql",
"version": "0.1.0",
"dependencies": {
"pg": "^7.12.1"
}
}
到目前为止,没有问题...
现在,我编写代码并导出以在 Google Cloud Platform 中使用我的简单代码。我使用命令行,然后在 src 目录上移动以执行以下行:
gcloud 函数部署 functionNameInGCP --runtime nodejs10 --trigger-http --entry-point functionNameInIndexJS --region europe-west1
问题是部署不起作用。
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 Functions 放置许多其他目录。
例如,在 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.js 文件。但我不想要这样,我想要一个包含我所有 Google Cloud 功能的项目文件夹。
谢谢你的时间。