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将首先匹配示例中的路由,因此将首先检查并找到user 123;然后/users可以这样做的结果。

我认为,路由中间件是一种更灵活,功能更强大的工具,因为它不依赖于特定的URI方案或路由排序。我倾向于对这样显示的示例进行建模,假设Users模型具有async

findOne()

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

});

能够像这样控制流量非常方便。您可能希望某些页面仅对带有admin标志的用户可用:

/**

* 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');

});

希望这给您一些启发!

以上是 Express中使用的“ next”参数是什么? 的全部内容, 来源链接: utcz.com/qa/428167.html

回到顶部