基于ES6/Node.js v16将Express部署到AWS Lambda的问题
解决AWS Lambda中ES6模块下Express应用的Handler导出问题
你的核心问题是没搞清楚Lambda对ES6模块导出的要求,以及serverless-http的正确使用方式,以下是具体解决方案:
错误原因
你之前写的代码导出了一个需要接收app参数的函数,但Lambda运行时会直接尝试加载导出的handler,不会主动给你传递app参数;同时Lambda默认会寻找命名导出的handler,而不是默认导出的函数,这就导致了HandlerNotFound错误。
正确的两种实现方式
方式一:命名导出handler(推荐)
在你的Express应用文件中,直接把用serverless-http包装好的app作为命名的handler导出:
import express from 'express'; const app = express(); // 这里写你的路由、中间件配置 app.get('/', (req, res) => { res.send('Hello from Lambda!'); }); import serverless from 'serverless-http'; // 关键:直接导出命名的handler export const handler = serverless(app);
这种方式不需要修改serverless配置,Lambda会自动识别到导出的handler函数。
方式二:默认导出+修改serverless配置
如果你想用默认导出,需要在serverless.yml里指定加载默认导出:
functions: your-function-name: handler: app.default # 这里的app是你的文件名,.default表示加载默认导出 # 其他配置(比如触发器等)
对应的代码:
import express from 'express'; const app = express(); // 路由和中间件配置 app.get('/', (req, res) => { res.send('Hello from Lambda!'); }); import serverless from 'serverless-http'; export default serverless(app);
注意事项
- 确保
package.json中已经设置"type": "module",让Node.js将文件识别为ES6模块。 - 不要将
handler写成需要接收参数的函数,Lambda运行时不会传入app,必须在同一个文件中创建好app实例并直接包装导出。
内容的提问来源于stack exchange,提问作者Paul K
相关产品推荐
相关产品推荐

