Javascript Node.js Express-为什么下一条(“路线”)不通向下一条路线?

Javascript Node.js Express-为什么下一条(“路线”)不通向下一条路线?,javascript,node.js,express,Javascript,Node.js,Express,这是我的代码,它是用Node express构建的。下一条(“路线”)在两种类似情况下不能统一工作 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.

这是我的代码,它是用Node express构建的。下一条(“路线”)在两种类似情况下不能统一工作

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地址:”时,节点REPL控制台输出:“当前id为2”,网页显示:“这是id为1时的场景”

我对此感到很困惑。根据express的官方文件,下一条(“路线”)将控制下一条路线

所以我假设它应该显示“这是一个详细信息页面”,而不是“这是一个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");
});
我只是简单地更换了路由器。使用路由器。获取,这次当我再次访问”时,网页显示“这是一个详细信息页面”

为什么在这两种情况下结果不同?

有人指出

要从路由器中间件堆栈中跳过其余的中间件功能,请调用next('route')将控制权传递给下一个路由。注意:next('route')将仅在使用app.METHOD()或router.METHOD()函数加载的中间件函数中工作


请注意注释部分,next('route')是要跳过的,但在第一种情况下它不是跳过的,因为您没有使用route.METHOD(),而是使用了router.use()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();
});

因为您正在呼叫
next('router')
,而不是
next('route')
。您能进一步澄清一下吗?我在express文档中找不到
next('router')
,您介意链接到您读到这是一个有效选项的地方吗?搜索这行文本要从路由器中间件堆栈中跳过其余的中间件功能,请调用next('route')将控制权传递给下一个路由。注意:next('route')将仅在使用app.METHOD()或router.METHOD()函数加载的中间件函数中工作。“在”expressjs.com/en/guide/using middleware.html中搜索next('router')噢,谢谢!我刚刚发现router.use不属于router.METHOD。这里的官方参考:谢谢,我得到了答案!