Node.js “自定义依赖项”;nodejs/";无法从aws lambda解析目录

Node.js “自定义依赖项”;nodejs/";无法从aws lambda解析目录,node.js,amazon-web-services,ecmascript-6,aws-lambda,aws-lambda-layers,Node.js,Amazon Web Services,Ecmascript 6,Aws Lambda,Aws Lambda Layers,我正在尝试从lambda层导入自定义依赖项,但不起作用 环境:nodejs8.10 我有一个由以下目录结构组成的层: mylayer.zip- |-nodejs- |-util.js 在这里,util.js有以下代码: module.exports = function SomeFunction() { console.log('Told you This Doesn't work'); } const someFuncti

我正在尝试从lambda层导入自定义依赖项,但不起作用

环境:nodejs8.10

我有一个由以下目录结构组成的层:

mylayer.zip-
           |-nodejs-
                   |-util.js 
在这里,util.js有以下代码:

module.exports = function SomeFunction() {
  console.log('Told you This Doesn't work');
}

const someFunction = require('/opt/nodejs/util')
exports.handler = async (event) => {

    someFunction();
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

在myLambda.js中,我试图用以下代码调用
SomeFunction

module.exports = function SomeFunction() {
  console.log('Told you This Doesn't work');
}

const someFunction = require('/opt/nodejs/util')
exports.handler = async (event) => {

    someFunction();
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

但是,我得到了这个错误:

{
  "errorMessage": "Cannot find module '/opt/nodejs/util'",
  "errorType": "Error",
  "stackTrace": [
    "Function.Module._load (module.js:474:25)",
    "Module.require (module.js:596:17)",
    "require (internal/module.js:11:18)",
    "Object.<anonymous> (/var/task/index.js:1:75)",
    "Module._compile (module.js:652:30)",
    "Object.Module._extensions..js (module.js:663:10)",
    "Module.load (module.js:565:32)",
    "tryModuleLoad (module.js:505:12)",
    "Function.Module._load (module.js:497:3)"
  ]
}
{
“errorMessage”:“找不到模块'/opt/nodejs/util',
“errorType”:“Error”,
“stackTrace”:[
“Function.Module._load(Module.js:474:25)”,
“Module.require(Module.js:596:17)”,
“要求(内部/module.js:11:18)”,
“对象。(/var/task/index.js:1:75)”,
“模块编译(Module.js:652:30)”,
“Object.Module._extensions..js(Module.js:663:10)”,
“Module.load(Module.js:565:32)”,
“tryModuleLoad(module.js:505:12)”,
“Function.Module.\u加载(Module.js:497:3)”
]
}
提前感谢。

我在您列出的目录结构中没有看到“opt”;也许您只需要“/nodejs/util”作为您的路径

此外,我认为您需要参考模块中的函数:

const util = require('./nodejs/util')
exports.handler = async (event) => {

    await util.someFunction();
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

如果要将lib放入图层,而不想在nmp上发布lib,则可以将文件或文件夹添加到图层
节点\u模块
文件夹

防止命名冲突 为防止命名冲突,建议使用@scoped包名

要创建自己的范围,请转到并创建一个组织(f.e
myscope
)。 现在,您可以将任何您喜欢的内容放入
节点\u模块/@myscope
,而无需冒命名冲突的风险

您的图层文件夹结构可能如下所示:

mylayer.zip-
           |-nodejs-
                   |-node_modules-
                                 |-@myscope-
                                        |-utils-
                                             |-utils.js
                                             |-somthing.js

mylayer.zip-
           |-nodejs-
                   |-util.js 
然后,您可以要求范围文件夹中的所有内容:

const someFunction = require('@myscope/utils/utils.js')
const someOtherFunction = require('@myscope/utils/something.js')
替代解决方案 实现目标的另一种方法是更改lambdas
NODE\u PATH
环境变量

默认值(取决于lambdas节点运行时)为:

/opt/nodejs/node12/node_模块:/opt/nodejs/node_模块:/var/runtime/node_模块:/var/runtime:/var/task

保持在aws推荐的文件夹结构内 只需将
/opt/nodejs
添加到该列表中:

/opt/nodejs:/opt/nodejs/node12/node_模块:/opt/nodejs/node_模块:/var/runtime/node_模块:/var/runtime:/var/task

有这样一层:

mylayer.zip-
           |-nodejs-
                   |-node_modules-
                                 |-@myscope-
                                        |-utils-
                                             |-utils.js
                                             |-somthing.js

mylayer.zip-
           |-nodejs-
                   |-util.js 
现在,您可以使用
require(“/opt/nodejs/utils.js”)


或者只是
require(“utils.js”)

“opt”不在您共享的目录结构中。您可能需要修复路径。@ArUn这不是相对路径引用。相反,它是一个lambda层,应该在运行时在
/opt
下提取给定的myLayer.zip。请确保您的zip命令不会像这样创建额外的目录myLayer.zip->myLayer->nodejs->……,这在我的情况下是一个问题谢谢,但是“/nodejs/util”实际上不适用于我的代码,而是在“/opt”下提取的目录如所示。不过,我将从导入的模块调用函数,并检查其是否有效。我可以这样做,但我已经创建了内部库,以便从lambda轻松地与aws sdk交互,我希望将其部署为层,以便其他lambda可以从层直接使用它。我当然可以把它推到npm上,并作为DEP使用,但我想避免每次myLib中发生变化时发布npm包的额外步骤。我只是想知道是否有人曾经这样做过,并且能够实现我正在尝试的目标。是的,只需将您的utils.js复制到layers.zip文件中的文件夹
nodejs/node_modules/utils/utils.js
,如我在回答中所述。部署该层并从所有函数中使用utils.js。无需在npm上发布。。。这就是需求解决路径的方式;-)我现在在我的项目中使用完全相同的方法。。。你让它工作了吗?如果没有,请尽管问。实际上我还没有试过,谢谢你的帮助response@HolgerWill你的解决方案有效;然而,这实际上是一个解决办法,因为
require('utils/something')
建议“utils”是一个已发布的包(带有自己的“package.json”等)。如果在“nodejs/node_modules/*”的旁边,zip层可以有“nodejs/utils/something.js”,并允许
require('./utils/something')
导入它,这将更有意义。它明确区分了本地模块和发布的包。放入“节点单元模块”也会增加命名冲突的可能性,因为依赖链可能会带来几十个名称不重要的包。