2

我正在尝试从 lambda 层导入自定义依赖项,但无法正常工作。

环境:nodejs8.10

我有一个包含以下目录结构的层:

mylayer.zip-
           |-nodejs-
                   |-util.js 

在这里,util.js 有以下代码:

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

在 myLambda.js 中,我尝试SomeFunction使用以下代码进行调用:

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)"
  ]
}

提前致谢。

4

2 回答 2

4

如果您想将库放入层中,并且不想在 nmp 上发布您的库,您可以将文件或文件夹添加到层node_modules文件夹中。

防止命名冲突

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

要创建自己的范围,请转到https://www.npmjs.com/org/create并创建一个组织 (fe myscope)。现在你可以放任何你喜欢的东西,node_modules/@myscope而不会冒命名冲突的风险......

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

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

然后您可以要求范围文件夹中的所有内容:

const someFunction = require('@myscope/utils/utils.js')
const someOtherFunction = require('@myscope/utils/something.js')

替代解决方案

实现目标的另一种方法是更改​​ lambdasNODE_PATH环境变量。

默认值(取决于您的 lambdas 节点运行时)是:

/opt/nodejs/node12/node_modules:/opt/nodejs/node_modules:/var/runtime/node_modules:/var/runtime:/var/task

保持在 aws 推荐的文件夹结构内

只需添加/opt/nodejs到该列表:

/opt/nodejs:/opt/nodejs/node12/node_modules:/opt/nodejs/node_modules:/var/runtime/node_modules:/var/runtime:/var/task

有这样的层:

mylayer.zip-
           |-nodejs-
                   |-util.js 

现在你可以要求你的库require("/opt/nodejs/utils.js")

要不就require("utils.js")

于 2019-09-30T02:08:34.270 回答
0

我在您列出的目录结构中没有看到“选择”;也许你只需要'/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;
};
于 2019-09-28T09:55:49.193 回答