在AWS Lambda运行Node.js Express报错:listen EADDRINUSE地址已被占用
解决AWS Lambda + aws-serverless-express 报 EADDRINUSE 错误的调试方案
核心排查与解决步骤
1. 修复aws-serverless-express初始化的Socket路径问题
错误日志里的/tmp/server-undefined.sock明确说明Socket文件名包含undefined,大概率是初始化时参数缺失或变量未定义:
- 显式指定Socket路径,避免动态变量导致的未定义问题:
// 错误示例:依赖未定义的变量生成路径 const server = awsServerlessExpress.createServer(app, null, null, `/tmp/server-${serverName}.sock`); // 正确写法:直接写死路径或确保变量有值 const server = awsServerlessExpress.createServer(app, null, null, '/tmp/server-collage.sock'); - 把Server初始化放在Lambda Handler外部,避免每次请求重复创建绑定Socket:
// 放在handler外,仅初始化一次 const app = require('./app'); const awsServerlessExpress = require('aws-serverless-express'); const server = awsServerlessExpress.createServer(app, null, null, '/tmp/server-collage.sock'); exports.handler = (event, context) => { return awsServerlessExpress.proxy(server, event, context); };
2. 适配Node.js 18环境兼容性
- 检查
aws-serverless-express版本:执行npm ls aws-serverless-express,若版本低于3.4.0,更新到最新稳定版:npm install aws-serverless-express@latest - Node.js 18的
http模块行为有变更,确认Express代码中没有手动修改Socket相关配置,比如自定义server.listen参数。
3. 清理部署包缓存
- 即使新建Lambda,若复用旧S3部署包,可能残留旧代码:删除本地
node_modules,重新执行npm install,打包全新的部署包上传到Lambda。 - 检查Lambda层(Layer)是否包含旧版本依赖,若有则更新层内容。
4. 本地模拟调试
- 用
serverless-offline或aws-lambda-local在本地复现Lambda环境:- 执行
lsof /tmp/server-collage.sock(Mac/Linux)查看Socket占用进程,确认是否有残留。 - 本地运行Handler,观察是否每次请求都会重复绑定Socket。
- 执行
5. 替换为维护分支依赖
如果以上方法无效,改用@vendia/serverless-express(原aws-serverless-express的官方维护分支),对Node.js 18兼容性更好:
npm uninstall aws-serverless-express npm install @vendia/serverless-express
修改代码:
const serverlessExpress = require('@vendia/serverless-express'); const app = require('./app'); const server = serverlessExpress.createServer(app); exports.handler = (event, context) => serverlessExpress.proxy(server, event, context);
内容的提问来源于stack exchange,提问作者robliv
相关产品推荐
相关产品推荐

