отправить все маршруты через финальный метод - PullRequest
2 голосов
/ 04 июня 2019

Я использую 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] это промежуточное ПО. Мне было интересно, есть ли «конечное программное обеспечение», столь же простое, как промежуточное программное обеспечение, для отправки всех ответов перед выходом к пользователю, поэтому мне не нужно вручную копировать код генерирования токена и код заголовка на каждом маршруте.

Thx

Gina

Ответы [ 3 ]

1 голос
/ 04 июня 2019

К сожалению, для экспресс-ответов нет встроенного постпроцессора. Одним из решений этой проблемы, которое мы реализовали в моей компании, является группирование всех ожидающих свойств ответа в объект res.pending, а затем конечное промежуточное программное обеспечение, которое фактически завершает ответ HTTP через res.send(). При этом используется тот факт, что Экспресс промежуточного программного обеспечения имеет значение и может использоваться для стратегической задержки этапа последующей обработки до завершения всего промежуточного программного обеспечения.

Одно из приятных преимуществ этого решения, в дополнение к привилегии, которую вы вызывали из особой точки в коде для обработки аутентификации / метрик / ответов, заключается в том, что вы можете сделать так, чтобы более поздние части промежуточного программного обеспечения знали тело ответа до его отправки. , В противном случае, если нетерминальное промежуточное ПО вызывает res.send(), никакое следующее промежуточное ПО не имеет доступа к данным res.

1 голос
/ 04 июня 2019

Вы можете вызвать обратный вызов 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.

0 голосов
/ 04 июня 2019

Хорошо, я комбинирую ответ Рами и Джейкеминголла.

Я добавил обработчик промежуточного программного обеспечения "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);
});

-Gina

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...