监听端口后服务器无法启动,重启电脑后故障求助
核心问题分析
从nodemon日志clean exit来看,进程无报错就静默退出,大概率是未捕获的Promise拒绝(比如数据库连接失败)或代码语法/逻辑错误导致进程终止。结合你的代码,重点排查以下几点:
1. 缺失全局错误捕获
你的自执行异步函数未包裹try/catch,一旦内部Promise(比如createConnection)拒绝,进程会直接静默退出,无法看到具体错误信息。
2. User.findOne语法错误
代码中这一行存在明显逻辑错误:
const user = await User.findOne({ uid: payload.userId }.uid);
错误地访问了对象的uid属性,导致findOne接收的是单个值而非查询条件对象,运行时会抛出异常终止进程。
3. 数据库连接失败
重启电脑后,PostgreSQL服务可能未自动启动,或TypeORM的连接配置(地址、凭证等)出现问题,createConnection失败后直接终止进程。
4. 依赖版本兼容性冲突
apollo-server-express@3.10.2与type-graphql@1.1.1版本跨度较大,可能存在兼容性问题,导致启动失败。
分步解决
第一步:添加全局错误捕获,定位具体错误
修改index.ts的自执行函数,包裹try/catch捕获所有启动错误:
(async () => { try { const app = express(); // 原代码所有内容... app.listen(4000, () => { console.log("express server started"); }); } catch (err) { console.error("服务器启动失败详情:", err); } })();
重新运行npm run dev,控制台会输出具体错误信息,帮助精准定位问题。
第二步:修复User.findOne语法错误
将错误查询代码修改为正确格式:
// 正确的查询条件对象写法 const user = await User.findOne({ uid: payload.userId }); // 若使用TypeORM 0.3.x+版本,也可使用findOneBy: // const user = await User.findOneBy({ uid: payload.userId });
第三步:检查数据库连接状态
- 确认PostgreSQL服务已启动:在系统服务列表中找到PostgreSQL,确保其处于运行状态。
- 检查TypeORM配置:确认项目根目录存在
ormconfig.json/ormconfig.ts,配置中的数据库地址、端口、用户名、密码、库名与实际环境一致。 - 验证
.env文件:确认.env文件存在,且数据库相关环境变量(若TypeORM依赖)配置正确。
第四步:调整依赖版本(可选)
若错误提示与依赖兼容有关,尝试将type-graphql升级到与Apollo Server 3兼容的版本(如^1.2.0),或降低apollo-server-express到^2.x版本。
验证
修改完成后重新执行npm run dev,若启动成功,控制台会输出express server started;若仍有错误,根据try/catch捕获的信息进一步排查即可。
内容的提问来源于stack exchange,提问作者Kartik Fulara

