React代理Express报错:接口触发错误后出现ECONNREFUSED连接拒绝
问题诊断
你遗漏了错误分支的执行中断逻辑,这是直接导致后续请求代理报错的核心原因,和前端配置的proxy规则无关。
你的代码在数据库查询返回错误(比如邮箱唯一索引冲突)时,会先进入if(error)分支返回400响应,但分支执行完后没有终止回调逻辑,后续的201成功响应代码依然会执行。此时Express会触发Cannot set headers after they are sent的未捕获运行时错误,直接终止Node.js服务进程——你第一次触发邮箱重复错误时,400响应已经发到客户端所以看起来逻辑正常,但响应发完后服务就因为重复发送响应的错误崩溃了,后续前端再发请求时,8000端口已经没有服务在监听,自然会报ECONNREFUSED的代理错误。
修复方法
在错误响应发送完成后加return语句,阻断后续成功逻辑的执行即可:
// `pool` 来自 `pg` 连接池 pool.query( 'INSERT INTO users (first_name, last_name, user_name, email, password, last_password, password_salt) VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING *', [values.first_name, values.last_name, values.user_name, values.email, values.password, values.password, 'tmp_salt'], (error, results) => { if (error) { console.error(error.message); const response = {status: false, message: error.message}; res.status(400).send(response); return; // 错误处理完成后直接退出回调,不执行后续逻辑 } res.status(201).send(`User added with user_id: ${results.rows[0].user_id}`); } );
优化建议
- 修复后可以验证:触发邮箱重复错误后,观察终端的Node服务进程是否保持运行,正常情况下进程不会退出,后续注册请求可以正常被处理
- 建议给Express添加全局错误捕获中间件,同时监听Node进程的
uncaughtException、unhandledRejection事件做兜底处理,避免单个接口的逻辑错误直接打挂整个服务 - 你在前端package.json中配置的proxy规则是正常生效的,本次问题和跨域配置没有关联,不需要调整该配置。
内容的提问来源于stack exchange,提问作者RobertW
相关产品推荐
相关产品推荐

