【问题标题】:Failed to loading node_modules in Google Cloud Function (index.js, not on the project root)在 Google Cloud Function 中加载 node_modules 失败(index.js,不在项目根目录上)
【发布时间】:2019-09-17 08:04:31
【问题描述】:

所以我需要部署一个 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。但我不希望这样,我想要一个包含所有 Google Cloud Functions 的项目文件夹。

感谢您的宝贵时间。

【问题讨论】:

    标签: node.js postgresql google-cloud-functions node-modules


    【解决方案1】:

    我刚刚复制了您的问题并找到了解决方案。感谢您提供您使用的所有代码以及对您想要实现的目标的良好描述,这真的很有帮助。

    我复制了您的确切文件分发并对我的 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 的位置,则将其部署在该处不会有任何问题。 确保在 package.json 所在的 src/ 文件夹之外执行 gcloud 部署,它使用您指定的 main 来了解要使用的入口点。

    我使用了以下 gcloud 命令:

    gcloud functions deploy testfunction4 --runtime nodejs10 --trigger-http --entry-point select --region europe-west1
    

    让我知道它是否对你有用。

    编辑:

    看看这篇文章,this 可能适合您的用例。

    我认为我的回答是回答您最初的问题,您添加的开发可能是新线程/问题的情况。

    告诉我。

    【讨论】:

    • 与此同时,我找到了一个解决方案,即在每个子文件夹中创建一个 package.json 文件,该文件仅包含该文件夹中 index.js 的依赖项。在根目录上,一个 package.json 包含我项目的所有依赖项。因此,在您的链接中,我不确定是否会找到解决方案。我希望我能找到一个解决方案:'(
    猜你喜欢
    • 2021-11-23
    • 2022-06-16
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    相关资源
    最近更新 更多