我正在尝试编写一个快速的中间件,在其中记录某些req和res标头并将其写入外部数据库。
部分原因是抛出一个自定义错误处理程序,我可以在其中将err.stack,err.message,req.body,req.params和req.url写入外部文件或应用程序。
我尝试制作自己的错误处理程序,并在app.use()层次结构中最后调用它。在我的路线中,我抛出了一个新错误,在我的自定义错误处理程序中,我尝试记录该错误和req.body。但是,除了错误之外,什么都没有记录。
app.js
app.use(responseTime());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cookieParser());
app.use(multilogger({extended: false, development: true, interval: 5000}));
app.use(multiError);
app.use('/', indexRouter);
随机路线
router.post("/", function(req, res, next) {
return next(new Error("Oh no!"));
});
自定义错误
module.exports = function (err, req, res, next) {
console.error(err.message); //only this gets logged
console.error(req.body); // this doesn't appear
next(err);
};
我想在自定义错误处理程序中分解API调用的req对象,以便可以执行其他操作。
谢谢!
答案 0 :(得分:0)
之所以遇到这种情况,是因为Express会按照添加到Express的顺序评估所有中间件/路由。调用next()
的字面意思是“转到与该请求匹配的下一个可能的处理程序”。在大多数情况下,只有一条路由与请求的URI相匹配,这意味着下一个可能的处理程序将是未指定路由的处理程序。
在Express中,在所有其他中间件/路由之后的之后,您定义了没有路由的默认错误处理程序和404处理程序。 404处理程序应始终是Express App内的最后一条路由。
默认错误处理程序也是一种特殊的中间件,因为它接受4个参数,第一个是错误。检查错误是否已定义很重要,因为如果没有路由匹配,Express将调用默认错误处理程序,因为它没有指定路由。这就是为什么404处理程序始终追随默认错误处理程序的原因,因为它是所有与路由不匹配的请求的全部,并且在这些情况下不会出错。
详细了解Express中的Writing Middleware,Using Middleware和Error Handling。
const express = require('express')
const bodyParser = require('body-parser')
const PORT = process.env.PORT || 1337
// not sure where this is in your code based on question info
const indexRouter = require('./indexRouter')
const app = express()
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))
// Your Router
app.use('/', indexRouter)
// Default Error Handler
app.use((err, req, res, next) => {
// This is necessary to detect any unmatched routes that should be a 404
if (!err) {
return next()
}
// Handle Error and Respond
})
// 404 Handler, No Route Defined Matched the Requested Route
app.use((req, res) => res.sendStatus(404))
app.listen(PORT, () => console.log(`Listening on ${Port}`))