ExpressJS/NodeJS中抛出错误后如何获取错误信息?
问题解决方法
核心原因
Error构造函数仅接受字符串作为参数,你直接传入对象时,它会自动调用对象的toString()方法,结果就是[object Object],且自定义的statusCode和message属性不会被挂载到错误实例上,导致后续无法获取这些信息。
解决方案
方案一:自定义错误类(推荐)
创建继承自Error的自定义类,统一管理错误格式:
class CustomError extends Error { constructor(statusCode, message) { super(message); this.statusCode = statusCode; // 维护原型链,保证instanceof判断正常 Object.setPrototypeOf(this, CustomError.prototype); } } // 使用自定义错误类 app.use((req, res, next) => { throw new CustomError(404, 'Not Found'); }); app.use((err, req, res, next) => { console.log(`状态码:${err.statusCode},消息:${err.message}`); // 直接打印错误对象也能显示完整信息 console.log(err); // 转为JSON输出指定属性 console.log(JSON.stringify(err, ['statusCode', 'message', 'stack'])); });
方案二:手动给Error实例添加属性
如果不想自定义类,可在创建Error实例后挂载自定义属性:
app.use((req, res, next) => { const err = new Error('Not Found'); err.statusCode = 404; throw err; }); app.use((err, req, res, next) => { console.log({ statusCode: err.statusCode, message: err.message }); console.log(JSON.stringify(err)); });
额外提示
若一定要传递对象作为错误信息,可通过Error.captureStackTrace构建错误对象,但这种方式的错误不是标准Error实例,可能影响部分错误处理逻辑,谨慎使用:
app.use((req, res, next) => { const err = { statusCode: 404, message: 'Not Found' }; Error.captureStackTrace(err, arguments.callee); throw err; }); app.use((err, req, res, next) => { console.log(err.statusCode, err.message); console.log(JSON.stringify(err)); });
内容的提问来源于stack exchange,提问作者Epple
相关产品推荐
相关产品推荐

