Serverless路由运行两次后因端口3000占用崩溃求助
问题原因
你的代码在app.ts中调用了app.listen(3000),而serverless-offline处理请求时(尤其是InProcessRunner模式),每次请求都会重新加载handler模块。第一次请求时,app.listen启动Express服务器占用3000端口;第二次请求时模块再次加载,重复执行app.listen就会触发EADDRINUSE端口占用错误,导致程序崩溃。
注意:aws-serverless-express的作用是把Express应用包装成Lambda兼容的处理函数,不需要手动调用app.listen——这个方法仅用于本地直接启动Express做测试,在Serverless环境下完全多余。
解决方案
修改app.ts,只在本地直接运行该文件时才启动服务器,避免在Serverless环境中执行监听逻辑:
import cors from 'cors'; import express from 'express'; import routers from './routes'; const app = express(); app.use(cors({ maxAge: 43200 })); app.use( express.json({ verify: (req: any, res: express.Response, buf: Buffer) => { req.rawBody = buf; } }) ); app.use('/testRoute', routers.testRouter); // 仅在直接运行app.ts时启动本地服务器(用于本地开发测试) if (require.main === module) { const PORT = 3000; app.listen(PORT, () => console.log(`Server running on port ${PORT}`)); } export default app;
验证方式
- 本地直接运行
app.ts:服务器正常启动在3000端口,可直接测试接口。 - 使用
serverless offline启动服务:多次请求接口不会再出现端口占用错误,请求能正常返回响应且程序不会崩溃。
内容的提问来源于stack exchange,提问作者user6680
相关产品推荐
相关产品推荐

