当前位置: 首页 > 面试题库 >

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

司徒俊雄
2023-03-14
问题内容

假设您有一个简单的代码块,如下所示:

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 html" target="_blank">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');
});

希望这给您一些启发!



 类似资料:
  • 假设您有一个简单的代码块,如下所示: 这个函数有两个参数和,分别表示请求和响应对象。 另一方面,还有其他函数带有第三个参数,称为。例如,让我们看看下面的代码: 我不明白的意义是什么,也不明白为什么要使用它。在那个例子中,如果id不存在,实际上在做什么?

  • 问题内容: 在以下Express函数中: 什么是和?它们代表什么,它们是什么意思,它们是做什么的? 谢谢! 问题答案: 是一个对象,其中包含有关引发事件的HTTP请求的信息。作为对的响应,您可以用于发送回所需的HTTP响应。 这些参数可以命名为任何东西。您可以将代码更改为以下内容: 编辑: 说您有这种方法: 该请求将是一个具有以下属性的对象(仅举几例): ,这将是触发此特定操作的时间 ,在这种情况

  • 问题内容: 我将Express与Node一起使用,并且我有一个要求用户可以将URL请求为:。 这样的请求将返回JSON响应。 上述调用之前的JSON数据如下: 通过上述请求,响应JSON数据应为: 我已经配置了Express路由,如下所示: 但这是行不通的。我不确定如何传递多个参数,也就是说,我不确定是否正确的方法。是吗? 问题答案: 如果那不起作用,请尝试使用console.log(req.pa

  • 本文向大家介绍koa中next()的原理是什么?相关面试题,主要包含被问及koa中next()的原理是什么?时的应答技巧和注意事项,需要的朋友参考一下 是函数,返回的是。 把函数放进中, 时,是,转换。 源码 移除一些校验和报错代码翻译下就是这样,也就是常说的洋葱模型。 具体源码可以看我这篇文章。 若川:学习 koa 源码的整体架构,浅析koa洋葱模型原理和co原理

  • 问题内容: 我有一个简单的生成器功能 然后,我初始化生成器并尝试在控制台中打印值: 初次致电的论点去了哪里?有没有一种在生成器函数中利用它的方法? 这是Babel REPL ,您可以在其中看到该结果。 问题答案: 该方法定义如下: 25.3.1.2 Generator.prototype.next(value) 该方法执行以下步骤: 让 摹 是 这个 值。 返回GeneratorResume( g

  • 我正在尝试使用SAML来理解SSO。我遇到了RelayState参数,并且非常困惑为什么它在SSO中首先发送编码的URL?这到底是什么意思? 请从Google Developer留档中阅读以下内容: Google生成一个SAML身份验证请求。SAML请求被编码并嵌入到合作伙伴SSO服务的URL中。包含用户试图访问的Google应用程序的编码URL的RelayState参数也嵌入到SSO URL中。