【发布时间】:2021-01-06 08:24:45
【问题描述】:
我正在尝试实现快速错误处理中间件。它正在工作,但我不明白为什么在将err 复制到error 后,我必须将error.message 设置为等于err.message。扩展运算符是否没有从err 复制所有属性?当我检查 err 对象时,我什至看不到消息或堆栈属性。还有,为什么它能够在if块中创建错误消息之前记录错误消息。
这就是我扩展错误的方式
// src/utils/errorResponse.js
class ErrorResponse extends Error {
constructor(message, statusCode) {
super(message)
this.statusCode = statusCode
}
}
module.exports = ErrorResponse
自定义错误处理程序中间件
// src/middleware/error.js
const ErrorResponse = require('../utils/errorResponse')
const errorHandler = (err, req, res, next) => {
let error = { ...err }
console.log({ error.message }) // undefined
error.message = err.message
console.log({ error.message }) // `Resource not found with id of ${err.value}`
// Log to console for dev
// console.log(error.stack)
// Mongoose bad ObjectId
if (err.name === 'CastError') {
const message = `Resource not found with id of ${err.value}`
error = new ErrorResponse(message, 404)
} else {
console.log(error.name)
}
res.status(error.statusCode || 500).json({
success: false,
error: error.message || 'Server Error',
})
}
module.exports = errorHandler
我通过使用错误的 ObjectID 发出 get 请求来触发错误
// src/controllers/bootcamp.js
const Bootcamp = require('../models/Bootcamp')
...
// @desc Get single bootcamp
// @route GET /api/v1/bootcamps/:id
// @access Public
exports.getBootcamp = async (req, res, next) => {
try {
const bootcamp = await Bootcamp.findById(req.params.id)
if (!bootcamp) {
return next(err)
}
res.status(200).json({ success: true, data: bootcamp })
} catch (err) {
next(err)
}
}
【问题讨论】:
标签: node.js express middleware