我正在使用express编写REST API。有多个端点,每个端点都有自己的特定路由器。尽管每个端点都执行特定的任务,但是在所有请求中有一些通用的操作,例如auth,日志记录以及将结果格式化为通用输出。这些任务全部由基本路由器上的中间件执行,某些在端点路由器之前,而在其后。
//v1Router.js
...
//auth, set common headers, etc
app.use(preHandler)
//route to endpoints
app.use('/endpoint1', endpointRouter1)
app.use('/endpoint2', endpointRouter2)
app.use('/endpoint3', endpointRouter3)
//format and send data
app.use(postHandler)
//catch any errors from the chain
app.use(errorHandler)
//endpointRouter1.js
...
router.get('/people', getPeople)
router.get('/people/:id', getPerson)
router.get('*', handleBadPath)
function getPeople(req, res, next) {
res.locals.data = /*some data we got from db*/
next()
}
...
我已经实现了这一点,使得端点的所有功能都是中间件,并且这些端点内的数据(例如从数据库中检索到的内容)处于中间状态时保存在res.locals
中。然后,在基础路由器级别(postHandler
)捕获错误之前的最后一个中间件将res.locals
的内容格式化为记录的输出,记录总体请求处理状态,并使用{将其发送给用户{1}}。
这给我造成了一个问题,因为现在我发现很难/不可能对特定端点内不受支持的路由使用“全部捕获”处理程序。上面的示例不起作用,因为在res.json()
中,每个请求都将其囊括在内。包罗万象的每个处理程序都不会发送结果并结束流程,而是保存到endpointRouter1
并调用res.locals
。
考虑到这一点,我想知道是否有最佳实践来确定何时致电next()
?我实施了不好的方法吗?我想到的一些替代方案:
res.json()
函数绑定到响应like in this answer 但是,如果我当前的方法对于通过路由器的数据流来说是合理的,那么我如何针对不正确的请求正确实施全部收集?