You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 19:05:22