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