Express中使用的参数“next”是什么?
假设你有这样一个简单的代码块:
app.get('/', function(req, res){ res.send('Hello World'); });
这个函数有两个参数, req
和res
,分别代表请求和响应对象。
另一方面,还有其他函数带有第三个参数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。 如果不是,请求将被保留或打开。