Как я могу написать маршрут в express для выполнения проверки промежуточного программного обеспечения, а затем вернуть данные пользователю?

#node.js #express #get #middleware #router

#node.js #экспресс #получить #промежуточное программное обеспечение #маршрутизатор

Вопрос:

Моя цель — заставить angular выполнить вызов Express API. Затем API будет использовать промежуточное программное обеспечение для проверки токена из заголовка запроса. Если токен проходит, я хочу, чтобы он затем запустил функцию, которая выполняет предполагаемое получение и возвращает данные из базы данных.

 const express = require('express');
const router = new express.Router();

// Middleware that will return a status of 200 if sucessful
var authMiddleware = require('../middleware/AuthMiddleware.js');

// Controller that calls the db_api file which queries the DB
const o_l_vfn = require('../controllers/o_l_vfn.js');

// What I am doing currently that is not working
router.get('/o_l_vfn', authMiddleware.Validate, o_l_vfn.get);


//Currently getting an error of: 
// ERROR FOUND o_l_vfn: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

module.exports = router;  

Комментарии:

1. Я опубликовал ответ о том, как написать промежуточное программное обеспечение, однако я только что заметил комментарий к ошибке. Было бы полезно, если бы вы опубликовали фактическое промежуточное программное обеспечение и фактический контроллер.

Ответ №1:

Обратитесь к этой статье для получения руководства по написанию промежуточных программ Express https://expressjs.com/en/guide/writing-middleware.html это действительно хорошее руководство, и оно должно быть очень полезным.

Однако вот краткий ответ: написать промежуточное программное обеспечение очень просто. Вот пример:

 function authMiddleware(req, res, next) {
      // Write your logic here
      console.log('This is a middleware!!!')
      next()
}
  

теперь в вашем приложении express сделайте что-то вроде этого

 ...

app.use(authMiddleware)
...
  

Приведенный выше фрагмент кода будет запускать ваш код перед каждым маршрутом, если вы хотите написать это только перед определенным маршрутом, тогда сделайте что-то похожее на следующее

 app.get('/', authMiddleware, (req, res) => {
    // Run your endpoint logic here
    res.status(200).end()
})
  

Промежуточные программы никогда не должны возвращать статус успешного! В вашем коде говорится

// Промежуточное программное обеспечение, которое вернет статус 200 в случае успеха

Это неправильно, промежуточные программы похожи на водопад, они будут что-то делать, но НЕ ДОЛЖНЫ возвращать статус, кроме недопустимого статуса, если все прошло успешно, они должны вызвать next(), чтобы следующая функция могла выполняться в вашем случае, это контроллер. В случае недопустимого состояния, такого как недопустимый токен, ваше промежуточное программное обеспечение должно возвращать какой-то код состояния, например 400.

Комментарии:

1. Большое вам спасибо за этот подробный ответ.

2. Не проблема, мое удовольствие.

Ответ №2:

Лучший способ выразить логику промежуточного программного обеспечения проверки — передать ее в next(), если токен аутентификации действителен. Или преждевременно остановить обработку и ответить 401 несанкционированным, если токен аутентификации не в порядке.

Теперь у вас возникают проблемы с ответом дважды: сначала в промежуточном ПО аутентификации, а затем в контроллере. Если следовать предложенной логике, сервер отвечает только один раз как в сценариях «счастливый путь», так и в сценариях «несанкционированный доступ».