Подтвердить что ты не робот

Как я могу запустить обработчик маршрута вручную в express js?

Предположим, что у меня есть простое выражение js-приложения, например:

var express = require('express');
var app = express();

app.get('/', function(req, res) {
  return res.json({ hello: 'world' });
});

module.exports = app;

Я хочу иметь возможность перейти в командную строку, потребовать приложения, запустить сервер и смоделировать запрос. Что-то вроде этого:

var app = require('./app');
app.listen(3000);
app.dispatch('/') // => {hello:"world"}
4b9b3361

Ответ 1

Вы можете использовать модуль run-middleware именно для этого. Это работает путем создания новых объектов Request & Response и вызова вашего приложения с использованием этих объектов.

app.runMiddleware('/yourNewRoutePath',{query:{param1:'value'}},function(responseCode,body,headers){
     // Your code here
})

Больше информации:

Раскрытие информации: я сопровождающий и первый разработчик этого модуля.

Ответ 2

Это решение прекрасно работает с использованием Express 4.16 (и, опционально, маршрутизатора Express Promise, который является отличной оболочкой для обработки ошибок).

его предисловие: не использовать маршрутизатор внутри маршрутизатора и не переписывать запрос, как в других предложенных ответах

просто измените URL в запросе и верните его в функцию дескриптора маршрутизатора

const router = require('express-promise-router')();

router.post('/signin', function(req, res , next) {

    if (req.body.Username === 'admin') {
        req.url = '/admin/signin'   
        router.handle(req, res, next)
    }
    else  {  // default doctor
        req.url = '/doctors/signin'
        router.handle(req, res, next)
    }

});

router.post('/doctors/signin',someCallback1)
router.post('/admin/signin',someCallback1)

Ответ 3

Эти два варианта помогли мне без каких-либо ошибок:

Опция 1

app.post('/one/route', (req, res, next) => {
  req.url = '/another/route'
  req.method = 'GET'
  next();
});

app.get('/another/route', (req, res) => {
  console.log("Hi, I am another route");
});

вариант 2

app.post('/one/route', (req, res, next) => {
  req.url = '/another/route'
  req.method = 'GET'
  app._router.handle(req, res, next);
});

app.get('/another/route', (req, res) => {
  console.log("Hi, I am another route");
});
  • Экспресс: 4.15.4
  • Никакой дополнительной библиотеки или модуля npm не требуется

Ответ 4

Насколько мне известно, нет способа переключиться на конкретный маршрут изнутри, но есть способ отметить этот запрос, а затем перейти к следующему маршруту:

app.use((req, res, next) => {
    if("nextRouteCondition"){
        req.skip = true;
        return next();
    }
})

Это может позволить вам выполнить то, что вы хотите сделать.