通过Serverless.com部署node20 AWS Lambda函数将模块导入到ESM

问题描述 投票:0回答:1

我们正在使用 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...
在本地执行该函数效果很好!

我在这里缺少什么?

node.js amazon-web-services serverless-framework
1个回答
0
投票

我们在同一个 Serverless.yml 中同时拥有 Java Lambda 和 Node.js Lambda,并且 SLS v2 和现在的 v3 之间的打包工作似乎有所不同。

我将

package: artifact
移至 Java 函数,这样 Java 代码就不会出现在 Node.js Lambda ZIP 中,现在它工作正常!

显然,当 Node.js Lambda 中存在 Java 代码时,AWS 会感到困惑,然后似乎默认使用 ESM...

© www.soinside.com 2019 - 2024. All rights reserved.