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