我一直在尝试将我们的一个node.js应用程序转换并部署到lambda函数中,并且遇到了node_modules依赖项的一些问题 - 说它无法找到某些模块.我首先创建了一个package.json,然后在本地安装依赖项,然后将节点模块文件夹复制到lambda.
例如,我有一个需要sequelize和convict的项目,并且一直在收到错误,说它无法找到moment模块作为子依赖项.我看到那个时刻包含在我的node_modules的根目录中,但它没有包含在sequelize模块下的子文件夹中.
但是,这个项目在当地运行良好.lambda有什么区别,用它来部署一些有点长的节点模块的最佳实践是什么 - 只是node_modules文件夹的一个副本?在我所拥有的一些其他更简单的项目中,可以复制少量的node_modules而没有任何问题.
{
"errorMessage": "Cannot find module 'moment'",
"errorType": "Error",
"stackTrace": [
"Function.Module._resolveFilename (module.js:338:15)",
"Function.Module._load (module.js:280:25)",
"Module.require (module.js:364:17)",
"require (module.js:380:17)",
"VERSION (/var/task/node_modules/sequelize/node_modules/moment-timezone/moment-timezone.js:14:28)",
"Object. (/var/task/node_modules/sequelize/node_modules/moment-timezone/moment-timezone.js:18:2)",
"Module._compile (module.js:456:26)",
"Object.Module._extensions..js (module.js:474:10)",
"Module.load (module.js:356:32)",
"Function.Module._load (module.js:312:12)"
]
}
在我看来,这听起来像是由不同版本的npm. 您在本地运行的 Nodejs 版本是否与 Lambda 使用的版本相同(即v0.10.36)?
根据npm您用于本地安装模块的版本,node_modules目录内容的布局略有不同(主要是为了消除重复内容),这可能就是您的依赖项无法在 Lambda 中找到其依赖项的原因。
经过一番挖掘后,听起来全新安装(即rm您的node_modules目录并运行npm install)可能会为您清理一切。原因是,npm如果子依赖项已经存在于顶层(即您moment之前安装过sequelize,等等),则似乎不会安装子依赖项。
| 归档时间: |
|
| 查看次数: |
1004 次 |
| 最近记录: |