【问题标题】:function used across several lambda functions in aws在 aws 中跨多个 lambda 函数使用的函数
【发布时间】:2021-10-25 04:35:13
【问题描述】:

我是 nodeJS、npm 和 aws lambda 的新手。假设我有一个想要在几个 lambda 函数中使用的自定义排序算法。这应该是非常简单的事情,但我发现的唯一方法是创建一个层,其中包含一个发布为 npm 包的节点模块。我不希望将任何代码上传到 npm。

我尝试下载我当前使用的层,在 node_modules 中创建一个文件夹以及在 npm 中发布的其他包

  1. npm 初始化
  2. 填写 package.json 的所有信息
  3. 在 index.js 中创建了一个函数代码
    'use strict'    
    exports.myfunc= myfunc;  
    function myfunc() {
        console.log("This is a message from the demo package");
    }
  1. 再次压缩所有图层并将其上传到图层的第 2 版中

  2. 在 lambda 函数中选择新版本并调用它,就像我对来自第三方的任何其他 node_module 所做的那样,如下所示:

    const mypack= require('mypack'); mypack.myfunc();

但它告诉我:

"errorMessage": "错误:找不到模块...\n需要堆栈:\n- /var/task/index.js\n- /var/runtime/UserFunction.js\n- /var/runtime/ index.js",

我认为这可能是因为在 nodejs 文件夹的层中,有 package-lock.json 而我的模块不在那里。我试图把它放在那里,没有在 npm 上发布的包具有但不起作用的“已解决”和“完整性”。

有没有办法在与 npm 无关的 nodejs 层中简单地上传我想要的代码?

我想在接受的答案中尝试这样的事情, var moduleName = require("path/to/example.js") How to install a node.js module without using npm?

但是我不知道层的模块的路径在哪里,显示__dirname的lambda路径是/var/task,但看起来任何lambda都有相同的路径。我迷路了……

【问题讨论】:

  • 如果您使用的是 monorepo 解决方案,您也可以放弃使用层并使用例如 lerna 在本地管理您的包。

标签: node.js amazon-web-services aws-lambda


【解决方案1】:

我可以通过以下方式将 js 导入文件夹中:

下载层的 zip 解压缩它,将带有自定义 js 的任何其他文件夹放入 node_modules 并将其作为层的新版本上传。 在 lambda 函数中,将其引用为 moduleName = require("path/to/example.js")

您可以找到该路径,这就是这里的技巧,使用您在层中已经拥有并且正在工作的已知库,在我的情况下,我使用 base64-js,然后我返回了该库的路径,如下所示:

require.resolve('base64-js')

返回

'/opt/nodejs/node_modules/base64-js/index.js'

所以我用了

moduleName = require("/opt/nodejs/node_modules/MYCUSTOMFOLDER/index.js")

就是这样……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2018-01-13
    • 2021-08-31
    • 2016-11-02
    相关资源
    最近更新 更多