Express中使用的参数“next”是什么?

假设你有这样一个简单的代码块:

app.get('/', function(req, res){ res.send('Hello World'); }); 

这个函数有两个参数, reqres ,分别代表请求和响应对象。

另一方面,还有其他函数带有第三个参数next 。 例如,让我们看看下面的代码:

 app.get('/users/:id?', function(req, res, next){ // Why do we need next? var id = req.params.id; if (id) { // do something } else { next(); // What is this doing? } }); 

我不明白next()是什么,或者为什么使用它。 在这个例子中,如果id不存在, next究竟在干什么?

它将控制权交给下一个匹配路线。 例如,在你给的例子中,如果给出了一个id ,你可以在数据库中查找用户,并将其分配给req.user

下面,你可以有一个像这样的路线:

 app.get('/users', function(req, res) { // check for and maybe do something with req.user }); 

由于/ users / 123将首先匹配您的示例中的路由,那么将首先检查并find用户123 ; 那么/users可以做的事情的结果。

路由中间件 (注意:链接是2.x文档,但这是testing3.x版本)是一个更灵活和强大的工具,但在我看来,因为它不依赖于一个特定的URIscheme或路线sorting。 假设Users模型使用asynchronousfindOne() ,我倾向于像这样build模示例。

 function loadUser(req, res, next) { if (req.params.userId) { Users.findOne({ id: req.params.userId }, function(err, user) { if (err) { next(new Error("Couldn't find user: " + err)); return; } req.user = user; next(); }); } else { next(); } } // ... app.get('/user/:userId', loadUser, function(req, res) { // do something with req.user }); app.get('/users/:userId?', loadUser, function(req, res) { // if req.user was set, it's because userId was specified (and we found the user). }); // Pretend there's a "loadItem()" which operates similarly, but with itemId. app.get('/item/:itemId/addTo/:userId', loadItem, loadUser, function(req, res) { req.user.items.append(req.item.name); }); 

能够像这样控制stream量非常方便。 您可能希望只有拥有pipe理员标记的用户才能使用某些网页:

 /** * Only allows the page to be accessed if the user is an admin. * Requires use of `loadUser` middleware. */ function requireAdmin(req, res, next) { if (!req.user || !req.user.admin) { next(new Error("Permission denied.")); return; } next(); } app.get('/top/secret', loadUser, requireAdmin, function(req, res) { res.send('blahblahblah'); }); 

希望这给了你一些启发!

下一个()我也有问题了解,但是这有帮助

 var app = require("express")(); app.get("/", function(httpRequest, httpResponse, next){ httpResponse.write("Hello"); next(); //remove this and see what happens }); app.get("/", function(httpRequest, httpResponse, next){ httpResponse.write(" World !!!"); httpResponse.end(); }); app.listen(8080); 

接下来用于将控制权交给下一个中间件function。 如果不是,请求将被保留或打开。