Экспресс-маршрут работает только со второй попытки

Я использую экспресс-фреймворк для внутреннего сервера node.js. Я использую экспресс-маршрутизатор для определения различных маршрутов.

Это мой app.js файл:

var express = require('express');
var app = express();
var server = require('http').Server(app);

var cors = require('cors');
app.use(cors());

app.use(express.json());

var route = require('./route');
app.use('/api/', route);

server.listen(3000, () => {
    console.info('App running on port 3000!');
});

Это мой роутер route.js:

var express = require('express');
var router = express.Router();

var controller = require('./controller');

router.use(function (req, res, next) {

    next();

    router.get('/test', function (req, res, next) {
        controller.get(req, res, next);
    });

});

module.exports = router;

Сам маршрут использует контроллер для логики controller.js

exports.get = function (req, res, next) {
  res.send('Hello World');
}

Запуск приложения с помощью node app.js и вызов определенного маршрута http://localhost:3000/api/test приведет к Cannot GET /api/testс первой попытки. Однако вызов маршрута второй раз приведет к ожидаемому ответу hello world.

В чем причина неудачи первого звонка? Почему это работает со второй попытки? Любые идеи приветствуются

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Потому что router.use(function (req, res, next) { будет выполняться только по первому запросу, а когда вы вызываете next() маршрут еще не добавлен. После этого вы звоните router.get(...), который добавит маршрут, чтобы он был доступен в следующий раз.

Тем не менее, это просто плохо, переместите .get(...) за пределы .use(...) (вы также можете полностью избавиться от него).

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

Tim Heß 28.07.2019 12:01

"переместите .get(...) за пределы .use(...)"

Jonas Wilms 28.07.2019 12:11

Просто чтобы было понятно, ты сделал это неправильно - вот что имеет в виду Йонас.

Maayao 28.07.2019 17:34

Другие вопросы по теме