提问者:小点点

在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实际上在做什么?


共2个答案

匿名用户

它将控制传递给下一个匹配的路由。例如,在您给出的示例中,如果给出了ID,您可能会在数据库中查找用户,并将其分配给req.user

在下面,您可以有如下的路由:

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

由于/users/123将首先匹配示例中的路由,因此将首先检查并查找user123;那么/users就可以对其结果执行某些操作。

路由中间件是一个更加灵活和强大的工具,但在我看来,因为它不依赖于特定的URI方案或路由排序。假设users模型具有异步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);
});

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

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

希望这能给你一些启发!

匿名用户

我在理解next()时也有问题,但这对我有帮助

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