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
相关产品推荐
相关产品推荐

