我有一个运行良好的 Lambda nodejs 20.x 函数,现在我想从我编写并放入本地目录的名为 local_util 的模块中导入和使用一个对象。但是,Lambda 的 CloudWatch 日志现在显示:
Cannot find module '/var/local_util/index.js' imported from /var/task/index.js
如何让 Lambda 找到我的模块?我以前从未尝试过导入自己的nodejs模块。
我在 lambda 代码目录的上一级创建了一个名为“local_util”的目录,将我的新模块的 index.js 放在那里。
// local_util/index.js
const lock = {
get: async function (thing) {
// reinvent AWS distributed lock management because it's so fun...
},
release: async function(thing, id) {
// more fun...
}
};
export { lock };
然后我运行“npm init”并将此行添加到新的 package.json 中:
"type": "module",
现在我有了这棵树:
lambda/
|__my_lambda_func/
|__index.js
|__package.json
|__package-lock.json
|__node_modules/
|__local_util/
|__index.js
|__package.json
在 my_lambda_func/index.js 中我添加了这一行:
import { lock } from '../local_util/index.js';
最后,我在 my_lambda_func/ 目录中执行了
npm install --install-links ../local_util
,然后是 zip -qr function.zip .
。当我部署新的 function.zip 并调用其函数时,我在 CloudWatch 中收到 Cannot find module '/var/local_util/index.js' imported from /var/task/index.js
错误。
这是完整的错误:
{
"errorType": "Error",
"errorMessage": "Cannot find module '/var/local_util/index.js' imported from /var/task/index.js",
"code": "ERR_MODULE_NOT_FOUND",
"url": "file:///var/local_util/index.js",
"stack": [
"Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/var/local_util/index.js' imported from /var/task/index.js",
" at new NodeError (node:internal/errors:406:5)",
" at finalizeResolution (node:internal/modules/esm/resolve:238:11)",
" at moduleResolve (node:internal/modules/esm/resolve:850:10)",
" at moduleResolveWithNodePath (node:internal/modules/esm/resolve:972:12)",
" at defaultResolve (node:internal/modules/esm/resolve:1091:79)",
" at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:383:12)",
" at ModuleLoader.resolve (node:internal/modules/esm/loader:352:25)",
" at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:228:38)",
" at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:85:39)",
" at link (node:internal/modules/esm/module_job:84:36)"
]
}
我的解决方案是更改我的导入语句
import { lock } from '../local_util/index.js';
到
import { lock } from './node_modules/local_util/index.js';
这解决了这个问题,因为相对于我上传的 .zip 文件的根目录,
./node_modules/local_util/index.js
实际上是模块文件所在的位置。