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

Node.js Express如何修复错误处理返回[object Object]的问题

问题描述

使用Node.js Express框架开发用户登录接口时,采用async/await编写异步逻辑,尝试通过try/catch捕获业务错误后调用next(error)传递给错误处理中间件,但实际运行时接口返回内容为[object Object],无法正常展示错误提示。

问题代码

async login(req, res, next) {
  try {
    const {username, password} = req.body;
    const user = await UserModel.findOne({username});
    if(!user) throw {status: 401, message:'نام کاربری یا رمز عبور اشتباه میباشد'}
    const compareResualt = bcrypt.compareSync(password, user.password)
    if(!compareResualt) throw {status:401, message:"نام کاربری یا رمز عبور اشتباه میباشد"}
    return res.status(200).json({
      status:200,
      success:true,
      message:'شما با موفقیت وارد شدید',
      token:""
    })
  } catch (error) {
    next(error)
  }
}

问题原因

核心问题是直接抛出了普通字面量对象,而非标准Error实例。Express默认的错误处理逻辑会将传入的错误转换为字符串输出,普通对象转字符串的固定结果就是[object Object],因此无法正常展示自定义的错误信息。

修复方案

方案1:抛出标准Error实例(推荐)

将自定义错误改为Error实例,同时挂载自定义的status状态码属性,错误处理中间件可以正常识别,同时标准Error实例会携带错误调用栈,方便后续排查问题:

async login(req, res, next) {
  try {
    const {username, password} = req.body;
    const user = await UserModel.findOne({username});
    if(!user) {
      const err = new Error('نام کاربری یا رمز عبور اشتباه میباشد');
      err.status = 401;
      throw err;
    }
    const compareResualt = bcrypt.compareSync(password, user.password)
    if(!compareResualt) {
      const err = new Error("نام کاربری یا رمز عبور اشتباه میباشد");
      err.status = 401;
      throw err;
    }
    return res.status(200).json({
      status:200,
      success:true,
      message:'شما با موفقیت وارد شدید',
      token:""
    })
  } catch (error) {
    next(error)
  }
}

方案2:自定义错误处理中间件

如果需要兼容直接抛出普通对象的写法,可自行实现错误处理中间件,显式读取错误对象的status和message属性返回响应,注意错误处理中间件必须固定包含4个参数(err, req, res, next),需要在所有路由注册完成后挂载:

app.use((err, req, res, next) => {
  const status = err.status || 500;
  const message = err.message || '服务器内部错误';
  res.status(status).json({
    status,
    success: false,
    message
  })
})

注意:即使使用自定义错误中间件,依然推荐抛出标准Error实例,普通字面量对象不会携带调用栈信息,会大幅提升线上问题的调试难度。

内容的提问来源于stack exchange,提问作者pouya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:18:16