何时使用res.locals发送回复?

时间:2019-08-09 04:54:08

标签: javascript node.js rest express

我正在使用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

但是,如果我当前的方法对于通过路由器的数据流来说是合理的,那么我如何针对不正确的请求正确实施全部收集?

0 个答案:

没有答案