【发布时间】:2020-06-21 10:59:45
【问题描述】:
我有一个想要在 Cloud Functions 中部署的小型 NodeJS 项目。因为这个项目使用了Pubsub,所以我在本地机器上使用了模拟器来模拟Pubsub,所以我可以在本地测试而无需先部署。我按照 here 和 here 的 Functions Framework 和 Pubsub 模拟器的说明进行操作。
这就是我的文件夹的结构:
project-folder/
+|index.js
|package.json
|lib/
+|mod_1.js
|mod_2.js
...
|mod_n.js
|node_modules/
lib 文件夹中的 js 文件是我的实用程序函数。我将这些模块导入程序的入口点文件index.js(因为我不太熟悉“标准”NodeJS 依赖管理)在本地开发中,如下所示:
const mod_1 = require('./lib/mod_1');
const { mod_2a, mod_2b } = require('./lib/mod_2');
...
package.json 看起来像这样:
"scripts": {
"start": "functions-framework --port=3000 --target=app",
我使用npm start 启动我的应用程序,这非常有效。
但是,当我尝试在 shell 中使用 gcloud functions deploy... 命令部署到 Cloud Functions 时,部署失败,因为它找不到我的私有模块。因此,阅读有关在 Cloud Functions here 中指定依赖项的文档后,我更新了 package.json 中的依赖项,以将我的模块包含在 lib 中:
"dependencies": {
"@google-cloud/functions-framework": "^1.5.1",
"@google-cloud/pubsub": "^2.1.0",
"express": "^4.17.1",
...
"mod_1": "file:./lib/mod_1",
"mod_2": "file:./lib/mod_2",
...
},
但是由于同样的问题仍然无法部署,现在还有一个问题是,当我在本地运行我的程序时出现错误,因为它无法检测到模块。我在index.js 和package.json 中尝试了各种组合,例如删除require 中的lib 前缀、添加.js 等,但似乎都没有效果。
我的问题是:
(1) NodeJS 中的依赖项是否有一个单一的通用标准(文件夹命名、导入库等)?在我看来,不同的框架有不同的风格。
(2) 如何使依赖项在本地开发环境和部署到 Cloud Functions 时都能正常工作?
我的 NodeJS 运行时是版本 10(至少对于 Cloud Functions)。
【问题讨论】:
-
这个“私有模块”存储在你的本地机器上吗?您需要在云功能可访问的地方发布。
标签: node.js google-cloud-functions