"nodejs/" 目录下的自定义依赖项无法从 aws-lambda 解析
Custom dependencies under "nodejs/" directory can not be resolved from aws-lambda
我正在尝试从 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)"
]
}
提前致谢。
我在您列出的目录结构中没有看到 "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;
};
如果你想把库放到一个图层中,并且你不想在 nmp 上发布你的库,你可以添加一个文件或文件夹到图层 node_modules
文件夹.
防止命名冲突
为防止命名冲突,建议您使用@scoped 包名称。
要创建您自己的范围,请转至 https://www.npmjs.com/org/create 并创建一个组织 (f.e 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')
备选方案
实现目标的另一种方法是更改 lambdas NODE_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")
我正在尝试从 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)"
]
}
提前致谢。
我在您列出的目录结构中没有看到 "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;
};
如果你想把库放到一个图层中,并且你不想在 nmp 上发布你的库,你可以添加一个文件或文件夹到图层 node_modules
文件夹.
防止命名冲突
为防止命名冲突,建议您使用@scoped 包名称。
要创建您自己的范围,请转至 https://www.npmjs.com/org/create 并创建一个组织 (f.e 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')
备选方案
实现目标的另一种方法是更改 lambdas NODE_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")