Node.js 为什么这个next()函数在控制台中打印它的参数?

Node.js 为什么这个next()函数在控制台中打印它的参数?,node.js,express,Node.js,Express,我是一个在节点和表达,学习的东西。我在这个链接上阅读了Express的文档:在本页的Route Handlers部分,它说: 您可以提供多个回调函数,其行为类似于中间件来处理请求。唯一的例外是,这些回调可能会调用下一个“路由”来绕过其余的路由回调 本页给出的示例不包含任何包含参数的next 我尝试实现它,并在此函数中作为参数传递一些路径,但它的行为异常,在控制台中打印该参数,并将其发送到浏览器。 下面是我的代码: const express = require('express'); const

我是一个在节点和表达,学习的东西。我在这个链接上阅读了Express的文档:在本页的Route Handlers部分,它说:

您可以提供多个回调函数,其行为类似于中间件来处理请求。唯一的例外是,这些回调可能会调用下一个“路由”来绕过其余的路由回调

本页给出的示例不包含任何包含参数的next

我尝试实现它,并在此函数中作为参数传递一些路径,但它的行为异常,在控制台中打印该参数,并将其发送到浏览器。 下面是我的代码:

const express = require('express');
const port = 8000;
const app = express();

app.get('/', (req, res, next) => {
    console.log("I am the first one");
    next('/demo');
}, function(req, res, next){
    console.log("I am the second one");
});

app.get('/demo', (req, res) => {
    console.log("Good!");
});

app.listen(port, (err) => {
    if(err){
        console.log("ERROS: ",err);
    }
    console.log("Express server is runnig on port: ",port);
});
在浏览器中,我输入了http://localhost:8000/The 控制台中的输出为:

下一个“/demo”函数调用不会导致/demo路由处理程序运行。 我哪里做错了? 我说得对吗? 实际上,我无法理解这个参数是如何与下一个函数一起工作的。

由于文档页面中没有任何函数中包含参数的示例,任何人都可以通过示例解释下一个函数如何使用参数吗

提前感谢您为中的下一个功能提供的帮助

app.get('/', (req,...
用于调用同一路由中的下一个回调

...
function(req, res, next){
    console.log("I am the second one");
});
从下一个“/demo”中删除/demo后,您将注意到我是控制台中的第二个。注意:next仅将控制传递给同一路由中的下一个中间件

app.get('/', (req, res, next)=>{ 
    // E.g. purpose of this middleware is to print request method
    console.log('Request method:', req.method)
    next() // this code passes the control to the next callback which is below
}, (req, res) => {
    console.log('End of route')
    res.send('OK')
}
它不会占用应用程序的路径。为了转到另一个路由,您必须发送另一个HTTP请求。希望这有帮助

更新这里的场景,其中下一个“路由”执行某些操作,这仅在两个路由具有相同的URI和http方法时有效

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

function middleware1(req, res, next){
  console.log('Middleware #1')
  next('route') // ends current callback chain, moves to the next route
}

app.get('/', middleware1, (req, res, next)=>{
  console.log('Second middleware') // this callback is not executed
  res.send('OK')
})

app.get('/', (req, res)=>{
  console.log('Test') // the callback in this route gets called
  res.send('2nd get / OK')
})

app.listen(3000, () => {
  console.log('Server @', 3000)
})

我认为路由的这种实现很少被付诸实践,因为我个人觉得拥有两个具有相同uri和http方法的路由是很乏味的。尽管如此,从白人甘道夫身上学到一些东西还是很好的。

我在这里做了一些深度潜水,因为它对我来说很有趣,然后我意识到这只是返回的错误。让我解释一下

基本上,next是一个特定于expressjs的功能,用于将控件传递给下一个功能单元。它不期望字符串的参数,除非下面给出了一个-在错误片段之后。即使在你正确初始化它的情况下

这是“网络”选项卡中的输出,一旦加载页面,请检查

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>/demo</pre>
</body>
</html>

在这里,中间件发挥了神奇的作用,匹配任何相同的路由参数,并继续执行所有这些参数

printing for request方法可能不是一个有意义的中间件的好例子。有目的的中间件的一个更好的例子是检查身份验证/JWT令牌/访问此路由的资格。但是,这个文档的声明意味着什么:这些回调可能会调用next'route'来绕过其余的路由回调。我想我会解释next'route'指的是在当前路由中调用next。正如@Gandalf the White所建议的,下一个不应该有参数。但是,如果有两个路由具有相同的URI“/”,则调用下一个“路由”是可行的。我将更新我的答案以显示这一点。否则,你可以参考甘道夫·怀特的回答。明白了,非常感谢你的帮助。你能举个例子,我们在下一个函数中传递一个参数吗?有一个例子可以帮助我理解你写的笔记,还是我们不能在下一页使用参数?@VinayYadav-在该页中搜索笔记,他们有例子。明白了,所以我们不能将参数传递给下一页。它有两种调用方式,一种是简单地将控制传递给下一个回调函数,另一种是我们可以编写下一个“路由”来绕过所有回调并移动到下一个路由。我做对了吗?是的,有时人们也会在其中传递错误;我还没有亲自做过。您可以在Internet上找到资源。@VinayYadav如果它回答了您的问题,请接受它作为答案。谢谢
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>/demo</pre>
</body>
</html>
app.get('/', (req, res, next) => {
    console.log("I am the first one");
    next();
}, function(req, res, next){
    console.log("I am the second one");
    next();
});
app.get('/', (req, res, next) => {
    console.log("I am the third one");
    next();
}, function(req, res, next){
    console.log("I am the fourth one");
});