Когда я изменяю URL в промежуточном программном обеспечении, он не переходит на следующее промежуточное программное обеспечение, даже если путь шаблона совпадения промежуточного программного обеспечения - PullRequest
0 голосов
/ 10 октября 2018

Когда я переписываю url в промежуточном программном обеспечении, экспресс перейдет к следующему первому промежуточному программному обеспечению, но не пойдет к следующему промежуточному программному обеспечению, даже если этот путь сопоставления шаблонов промежуточного программного обеспечения.Пример кода ниже.Когда я просматриваю http://localhost:3000, сообщение журнала консоли

middleware1

middleware2

, чтобы оно не переходило на middleware3

const express = require('express')
const app = express()

app.get('/',function (req, res, next) {
 // i want to rewrite url to http://localhost:3000/next but not redirect page
 req.url = req.protocol + '://' + req.get('host') + req.originalUrl + 'nxt' 
 console.log('middleware1');
 next()
})

app.use('/nxt',function (req, res, next) {
 console.log('middleware2');
 next()
})

app.use('/nxt',function (req, res, next) {
 console.log('middleware3');
 next()
})

app.listen(3000);

Но когда я просматриваю URL http://localhost:3000/nxt, сообщение журнала консоли

middleware2

middleware3

, так что он прыгаетна middleware3

Или, если я изменил "app.use" на "app.get" или "app.all", он все равно перейдет на middleware3 при просмотре URL http://localhost:3000

Пожалуйста, объяснитедля меня почему?это ошибка?Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Вы не должны переписывать все URL.req.url наследуется от модуля HTTP узла ( отметьте здесь ), который представляет относительный путь.

На основе вашего кода решение может быть:

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

app.get('/', function (req, res, next) {
  req.url = req.originalUrl + 'nxt';
  console.log('middleware1');
  next();
});

app.use('/nxt', function (req, res, next) {
 console.log('middleware2');
 next();
});

app.use('/nxt', function (req, res, next) {
 console.log('middleware3');
 next();
});

app.listen(3000);

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

app.use('/nxt',function (req, res, next) {
 console.log('middleware2');
 next();
}, function (req, res, next) {
 console.log('middleware3');
 next();
});

Обратите внимание, что обычно это не так.Я думаю, что он должен отправить ответ перенаправления клиенту (res.redirect(req.originalUrl + 'nxt')), который сделает новый запрос к /nxt.

0 голосов
/ 10 октября 2018

Вы можете просто сделать как -

app.get('/',function (req, res, next) {
    console.log('middleware 1');
    req.path = req.url = '/next';
    next();
});

app.use('/next',function (req, res, next) {
    console.log('middleware2');
    next()
});

app.use('/next',function (req, res, next) {
    console.log('middleware3');
    next();
});

Он напечатает.

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