Node.js Express - Почему следующий («маршрут») не ведет к следующему маршруту? - PullRequest
0 голосов
/ 25 сентября 2019

Это мой код, он построен на Node express . next («маршрут») не работает одинаково в 2 аналогичных ситуациях.

let express = require("express");
let app = express();
let router = express.Router();

router.use("/message/:id", function (req, res, next) {
    console.log(typeof req.params.id);
    if (req.params.id === 1 + "") {
        console.log("the current id is 1");
        next();
    } else if (req.params.id === 2 + "") {
        console.log("the current id is 2");
        next("route");
    } else if (req.params.id === 3 + "") {
        console.log("the current id is 3");
        next("router");
    } else {
        res.send("no id matched");
    }
}, function (req, res) {
    res.send("this is a scenario when id is 1");
});

router.use("/message/:id", function (req, res) {
    res.send("this is a details page");
});


app.use("/", router, function (req, res) {
    res.send("this is triggered by the app");
});

app.listen(8080, function () {
    console.log("Please visit localhost:8080");
});

Когда я вношу URL-адрес следующим образом: "http://localhost:8080/message/2",консоль узла REPL выводит: "текущий идентификатор равен 2" , а на веб-странице отображается: "это сценарий, когда идентификатор равен 1" .

ЯЯ совершенно запутался в этом. Согласно официальным документам Express, next («маршрут») передаст управление следующему маршруту.

Поэтому я предполагаю, что на нем должно отображаться «это страница с подробностями» вместо "это сценарий, когда id равен 1" . Почему?


Чтобы попытаться выяснить больше, я также внес некоторые изменения в коды:

let express = require("express");
let app = express();
let router = express.Router();

router.get("/message/:id", function (req, res, next) {
    console.log(typeof req.params.id);
    if (req.params.id === 1 + "") {
        console.log("the current id is 1");
        next();
    } else if (req.params.id === 2 + "") {
        console.log("the current id is 2");
        next("route");
    } else if (req.params.id === 3 + "") {
        console.log("the current id is 3");
        next("router");
    } else {
        res.send("no id matched");
    }
}, function (req, res) {
    res.send("this is a scenario when id is 1");
});

router.get("/message/:id", function (req, res) {
    res.send("this is a details page");
});


app.use("/", router, function (req, res) {
    res.send("this is triggered by the app");
});

app.listen(8080, function () {
    console.log("Please visit localhost:8080");
});

Я просто заменил router.use на router.get , и на этот раз, когда я вернусь "http://localhost:8080/message/2",на веб-странице отображается «это страница сведений» .

Почему в обоих сценариях результат отличается?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

router.get предназначен только для определения подпутей

var router = express.Router();
app.use('/api', router); // Mount the router as middleware at path /api

router.get('/signup', signup);
router.get('/user', userInfo);

If you open /api/signup, then the signup function will get called.
If you open /api/user, then the userInfo function will get called.

, при использовании router.use () вы можете предоставить только промежуточное ПО, например:

router.use(function(req, res, next) {
  console.log('%s %s %s', req.method, req.url, req.path);
  next();
});
0 голосов
/ 25 сентября 2019

Указано, что в документах , что

Чтобы пропустить остальные функции промежуточного программного обеспечения из стека промежуточного программного обеспечения маршрутизатора, вызовите next ('route'), чтобы передать управлениена следующий маршрут.ПРИМЕЧАНИЕ: next ('route') будет работать только в функциях промежуточного программного обеспечения, которые были загружены с помощью функций app.METHOD () или router.METHOD ().

Обратите внимание на раздел NOTE, затем('route') предназначен для пропуска, но в первом случае он не пропускался, потому что вы не использовали route.METHOD (), вы использовали router.use ()

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