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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:20:54