使用Model.findOne+async/await无法捕获查询错误的技术求助
问题分析与解决
你的代码出现ECONNRESET错误的核心原因是catch块里的响应写法不符合Express规范,导致服务器无法正确终止连接,进而触发客户端连接重置。
错误点
原代码中res.send("error", error)是错误用法:Express的res.send()仅接受一个参数,传入两个参数会导致响应发送逻辑异常,服务器没有正确关闭HTTP连接,Postman就会收到ECONNRESET错误。
修正方案
调整catch块的响应逻辑,用规范的方式返回错误信息,同时区分不同类型的错误:
router.post("/login", async function (req, res) { const { email, password } = req.body; try { const user = await User.findOne({ email }).orFail(); res.send(user); } catch (error) { // 针对Mongoose orFail抛出的"文档未找到"错误返回404 if (error.name === 'DocumentNotFoundError') { return res.status(404).json({ code: 404, message: "该邮箱对应的用户不存在" }); } // 其他未知错误返回500状态码 return res.status(500).json({ code: 500, message: "服务器内部错误", errorInfo: error.message }); } });
关键优化点
- 使用
res.json()返回结构化JSON响应,比res.send()更适合API场景,格式更清晰 - 通过
error.name判断错误类型,精准处理Mongoose的orFail抛出的DocumentNotFoundError - 每个响应分支添加
return,避免后续代码重复发送响应,防止出现Cannot set headers after they are sent to the client错误 - 明确返回状态码和错误信息,便于客户端(比如Postman)识别错误原因
内容的提问来源于stack exchange,提问作者jukenduit
相关产品推荐
相关产品推荐

