我们正在使用 Serverless.com 将 Lambda 函数部署到 AWS,并已开始将一些旧函数升级到 Node20。
provider:
name: aws
runtime: nodejs20.x
functions:
routeInvoice:
handler: src/functions/routeInvoice/routeInvoice.handler
有一个文件为
src/functions/routeInvoice/routeInvoice.js
,具有导出功能:
const handler = async (event, context) => {
console.log('event:', JSON.stringify(event), JSON.stringify(context));
try {
return await routeInvoice(event);
} catch (err) {
console.error('routeInvoice handler error:', err);
throw err;
}
};
module.exports = { handler };
部署后,我们收到错误:
{
"errorType": "Runtime.ImportModuleError",
"errorMessage": "Error: Cannot find module 'handler'\nRequire stack:\n- /var/runtime/index.mjs",
"stack": [
"Runtime.ImportModuleError: Error: Cannot find module 'handler'",
"Require stack:",
"- /var/runtime/index.mjs",
" at _loadUserApp (file:///var/runtime/index.mjs:1087:17)",
" at async UserFunction.js.module.exports.load (file:///var/runtime/index.mjs:1119:21)",
" at async start (file:///var/runtime/index.mjs:1282:23)",
" at async file:///var/runtime/index.mjs:1288:1"
]
}
package.json
没有任何 type
属性,根据 AWS 文档,文件扩展名 .js
应被视为 Common JS 而不是 ESM...
使用
sls invoke local -f routeInvoice...
在本地执行该函数效果很好!
我在这里缺少什么?
我们在同一个 Serverless.yml 中同时拥有 Java Lambda 和 Node.js Lambda,并且 SLS v2 和现在的 v3 之间的打包工作似乎有所不同。
我将
package: artifact
移至 Java 函数,这样 Java 代码就不会出现在 Node.js Lambda ZIP 中,现在它工作正常!
显然,当 Node.js Lambda 中存在 Java 代码时,AWS 会感到困惑,然后似乎默认使用 ESM...