客户端没有得到他们需要的响应"/>
在生产环境中,客户端没有得到他们需要的响应
我编写了这个 AppError 类,它足以让我的全局错误处理中间件发送有关操作和编程错误的响应。
class AppError extends Error {
constructor(message, statusCode){
super(message);
this.statusCode = statusCode;
this.status = `${statusCode}`.startsWith(4) ? 'fail' : 'error';
this.isOperational = true;
Error.captureStackTrace(this, this.constructor)
}
}
module.exports = AppError;
这是我的全局错误处理中间件,具有使其工作所需的所有必要功能。
const AppError = require('./AppError');
//global error handling middleware all errors go into it
module.exports = (err, req, res, next)=>{
err.statusCode = err.statusCode || 500;
err.status = err.status || 'error';
if(process.env.NODE_ENV === 'development'){
sendErrorDev(err, res)
}
else if(process.env.NODE_ENV === 'production'){
let error = {...err};
if(error.name === 'CastError') error = handleCastErrorDB(error);
sendErrorProd(err, res)
}
};
const sendErrorDev = (err, res) => {
res.status(err.statusCode).json({
status: err.status,
error: err,
message: err.message,
stack: err.stack
});
}
const sendErrorProd = (err, res) => {
// Operational, trusted error: send message to client
if (err.isOperational){
res.status(err.statusCode).json({
status: err.status,
message: err.message
});
}else{
// Programming or other unknown error: don't send details to client
//1_console err
console.log('error: ', err);
//2_send generic message to client
res.status(500).json({
status: 'error',
message: 'Something went very wrong!'
});
};
};
const handleCastErrorDB = err => {
const message = `Invalid ${err.path}: ${err.value}`;
return new AppError(message, 400)
};
我的问题是,在生产环境中,当我尝试通过 GET 请求获取数据时,客户端没有收到他们应该收到的错误,我正在与邮递员进行测试。详细说明一下,为了测试客户端得到什么,我正在尝试获取具有无效 ID 的数据...
127.0.0.1:3000/api/v1/tours/wwwwwwwwwwwwwwwwwww
这是客户端错误,因此,他们应该获得
handleCastErrorDB
中设置的带有 400 状态代码的响应,但相反,我看到带有消息的 500 状态代码
"status": "error",
"message": "Something went very wrong!"
如果错误无法运行,这是客户端将得到的响应。请参阅
sendErrorProd()
函数。
在开发模式下,我得到了我想要的东西,但藏在这里。
我正处于 Node.js 的学习模式,并且我已经尝试了我所知道的一切。
回答如下:首先,在下面的代码中。在最新版本的猫鼬中,我认为error.name不直接存在。
//global error handling middleware all errors go into it
module.exports = (err, req, res, next)=>{
err.statusCode = err.statusCode || 500;
err.status = err.status || 'error';
if(process.env.NODE_ENV === 'development'){
sendErrorDev(err, res)
}
else if(process.env.NODE_ENV === 'production'){
let error = {...err};
if(error.name === 'CastError') error = handleCastErrorDB(error);
sendErrorProd(err, res)
}
};
更多推荐
在生产环境中,客户端没有得到他们需要的响应
发布评论