通过 ES6 /Node.js v16 使用无服务器部署到 lambda

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

新手问题....

我有一个本地工作的node.js 应用程序,我现在正在尝试将其快速部署到AWS lambda。我已经使用本指南部署了测试版本(有效)。

我现在正在尝试实现我的应用程序,它使用 ES6(并且在 package.json 中具有 type: module)。

在我的应用程序中我添加了

import serverless from 'serverless-http'

但我无法弄清楚导出的适当语法 - 原始语法是...

module.exports.handler = serverless(app);

我已经尝试过:


const handler = async (app) =\> {
return serverless(app)
}

export default handler

收到错误消息:

2022-11-05T15:50:25.962Z 未定义错误未捕获异常

"errorType": "Runtime.HandlerNotFound",
"errorMessage": "app.handler is undefined or not exported",

"stack": [
    "Runtime.HandlerNotFound: app.handler is undefined or not exported",
    "    at Object.UserFunction.js.module.exports.load (file:///var/runtime/index.mjs:979:15)",
    "    at async start (file:///var/runtime/index.mjs:1137:23)",
    "    at async file:///var/runtime/index.mjs:1143:1"
]

我强烈怀疑我缺少一些基本的理解 - 非常感谢一些指导。

node.js ecmascript-6 serverless
2个回答
0
投票

错误的原因是,当 AWS Lambda 期望命名导出时,您正在发送默认导出。

该问题与所有 ES6 导入/导出相同:

// export.js
export default const defaultExport = "foo"
export const namedExport = "bar"

// import.js
import { defaultExport } from "./export.js" // error, cannot find defaultExport
import { namedExport } from "./export.js" // success, found namedExport
import defaultExport from "./export.js" // success, found defaultExport

因此,就像上面的情况一样,您发送 defaultExport,但 AWS Lambda 需要

{ namedExport }
。您只需从导出中删除
default
,并确保正确构建处理程序。以下是这样做的建议:

const lambda = serverless(app)

export async function handler(event, context) {
  return lambda(event, context)
}

我已经测试过,它正在使用 Node18.x 进行无服务器离线工作。您可以在 MDN 上阅读有关导出的更多信息。


0
投票

我替换了这个:

module.exports.handler = serverless(app);

这样:

const lambda = serverless(app)

export async function handler(event, context) {
  return lambda(event, context)
}

并且成功了

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