为了账号安全,请及时绑定邮箱和手机立即绑定

Node.js Express - 为什么 next("route") 不通向下一条路线?

Node.js Express - 为什么 next("route") 不通向下一条路线?

aluckdog 2021-10-29 13:42:05
这是我的代码,它是用Node express构建的。在接下来的(“路径”)不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 ”时,Node REPL 控制台输出:“当前 id 为 2”,网页显示:“这是 id 为1”。我对此很困惑。根据 express 的官方文档, next("route") 会将控制权传递给下一个路由。所以我认为它应该显示"this is a details page"而不是"this is a scenario when id is 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");});我简单地取代了router.use与router.get,而这一次,当我重温“ HTTP://本地主机:8080 /消息/ 2 ”,网页显示“这是一个详细信息页面”。为什么在这两种情况下结果不同?
查看完整描述

2 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

据说在文档

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

注意NOTE部分,next('route')是要跳过的,但在第一种情况下它没有跳过,因为你没有使用route.METHOD(),你使用了router.use()



查看完整回答
反对 回复 2021-10-29
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

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();

});


查看完整回答
反对 回复 2021-10-29
  • 2 回答
  • 0 关注
  • 246 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信