通过最终方法发送所有路线

时间:2019-06-03 21:10:20

标签: node.js express

我正在使用NodeJS进行表达。 Express支持中间件,它非常方便通过“预处理器”发送所有路由以进行身份​​验证等。

后处理程序是否等效?

我想在所有响应上更新令牌。这样一来,用户“正常工作”,其身份验证就不会过期,因为我总是刷新它。

可能会有一些混乱,所以我将添加一个示例代码:

router.get('/auth', [auth], async function({ user }, res) {

  …
  <<code to generate new token>>
  return res.header('Authentication', 'Basic ' + token).send(200);
});

因此,在每条路线的末尾,我想调用以下代码来更新标头:

  <<code to generate new token>>
  return res.header('Authentication', 'Basic ' + token).send(200);

[auth]是中间件。我想知道是否有一个像中间件一样容易发送出去的“端件”,然后再发送给用户,因此我不必手动在每个路由中复制令牌生成和标头代码。 / p>

Thx

吉娜

3 个答案:

答案 0 :(得分:1)

您可以从路由处理程序中调用next回调来调用下一个这样的中间件

router.get('/auth', [auth], async function({ user }, res, next) {
    ...
    next()
});

app.use((req, res, next) => {
    <<code to generate new token>>
    res.header('Authentication', 'Basic ' + token).send(200);
})

或者这样

const addAuth = (req, res) => {
    <<code to generate new token>>
    res.header('Authentication', 'Basic ' + token).send(200);
}

router.get('/auth', [auth], async function({ user }, res, next) {
    ...
    next()
}, addAuth);

但是您必须注意只使用一次res.send函数,因为它会关闭响应流,但是您可以使用res.write / res.end

答案 1 :(得分:1)

不幸的是,没有用于Express响应的内置后处理器。我们在公司实施的解决此问题的一种方法是将响应的所有未决属性分组为res.pending对象,然后拥有最终的中间件,该中间件实际上通过res.send()完成HTTP响应。这利用了Express middleware order matters的事实,并且可以从战略上延迟后处理步骤,直到所有中间件完成为止。

此解决方案的一大好处是,除了您从代码的单个点调用auth / metrics / response处理的特权外,您还可以使以后的中间件部分在发送响应主体之前就知道响应主体。否则,如果非终端中间件调用res.send(),则以下任何中间件都无法访问res数据。

答案 2 :(得分:0)

好的,我将Rami的答案和jakemingolla结合在一起。

我添加了一个中间件处理程序“ refreshToken”。这将生成一个新令牌并将其添加到res.pendingToken中。

router.get('/auth', [auth, refreshToken], async function(req, res) {

  …

  if (res.pendingToken) {
    return res.header('Authentication', 'Basic ' + res.pendingToken).sendStatus(200);
  }

  res.sendStatus(200);
});

-吉娜