在以下 express 应用中:
我想要实现的是,在第三种情况下,还会发送404。换句话说,如果路由未知,我希望被app.post('*',(req,res,next))捕获,它将抛出404,而不是由通用中间件错误处理程序捕获,抛出400 json SyntaxError
有什么办法可以做到这一点?
const express = require('express');
const { handleError, ErrorHandler } = require('./helpers/error');
const app = express();
app.use(express.json());
app.use(express.urlencoded({extended: true}));
app.get('/', function(req, res){
res.send('Hello World');
});
app.post('/', function(req, res){
console.log(req.body.data);
res.sendStatus(200);
});
app.post('/push', function(req, res){
console.log('push API');
res.sendStatus(200);
});
app.post('*',(req, res, next) => {
console.log('Unknown route');
throw new ErrorHandler(404, 'API endpoint does not exist.');
});
app.use((err, req, res, next) => {
console.log('Middleware error handling');
handleError(err, res);
});
app.listen(3000, function(){
console.log('Server started on port 3000')
});
error.js内容:
class ErrorHandler extends Error {
constructor(statusCode, message) {
super();
this.statusCode = statusCode;
this.message = message;
}
}
const handleError = (err, res) => {
const { statusCode, message } = err;
res.status(statusCode).json({
status: "error",
statusCode,
message
});
};
module.exports = {
ErrorHandler,
handleError
}
最佳答案
通过将请求发送到不存在的路由,不会匹配您的任何处理程序。因此,您的错误处理中间件
app.use((err, req, res, next) => {
console.log('Middleware error handling');
handleError(err, res);
});
直接执行。您可以做的是尝试在
handleError
函数中检测语法/解析错误。就像是:const handleError = (err, res) => {
let {statusCode, message} = err;
if (err.status === 400 && err.message.includes("Unexpected token")) {
statusCode = 404;
}
res.status(statusCode).json({
status: "error",
statusCode,
message
});
};
编辑:
可以通过仅对要解析json的路由使用json-parser中间件并将其删除为所有请求的常规中间件来解决此问题:
...
//app.use(express.json());
app.use(express.urlencoded({extended: true}));
app.post('/', express.json(), function (req, res) {
console.log(req.body.data);
res.sendStatus(200);
});
app.post('/push', express.json(), function (req, res) {
console.log('push API');
res.sendStatus(200);
});
关于node.js - 如果路由未知,Express.js会忽略SyntaxError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62040670/