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

尝试在express.js中理解'next / next()'时遇到困难

孙德宇
2023-03-14
问题内容

这是一个例子:

// Configuration
app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

(等等。)

app.get('/memo', function(req, res) {
  console.log("index");
  Memo.find({}, function(err, data) {
    if(err) return next(err);
    res.render('index', { memos: data });
  });
});

这是另一个:

app.get('/memo/list', function(req, res, next) {
  console.log("get memos");
  Memo.find({}, function(err, data) {
    if(err) return next(err);
    res.json(data);
  });
});

取自于构建在节点上的简单记事本

这些是困扰我的问题:

  1. 到底是next/next();做什么的?如果不存在会发生什么?
  2. 为什么第二部分next作为参数而第一部分不是参数?

编辑:


问题答案:

Express使用具有回调的中间件函数(动作完成时调用的函数),而next具有此目的(这是触发Express堆栈中下一个中间件的回调)。所有Express中间件(与Connect兼容)具有3个参数:请求,响应,下一个(可选)。

例如,静态中间件提供静态文件,csrf中间件在接收POST请求时检查参数,并处理路由的路由器中间件(上面粘贴的内容是其中的一部分)。

每个中间件都可以完成其任务,并next在满足某些条件的情况下调用队列中的中间件(例如,静态中间件不会调用下一个中间件,因为它会自行处理文件,以便路由器可以。)不会被打电话)。

在路由器中,您通常不调用next它,因为它往往是最后执行的中间件(除非您需要基准测试之类的东西)。

如果您要创建一个拒绝访问所有未登录用户的中间件,则next()仅在该用户登录后才必须调用(这样才能调用下一个中间件,在这种情况下,路由器可以使用户访问他们正在寻找的页面),否则您可能会将他们重定向到登录页面。

next 完全不接受任何参数或将错误作为参数。

编辑:根据您的配置,路由器在静态中间件之前,因此,如果要提供文件,则需要声明一个通配符路由,当路由不匹配时调用next():

app.get('*', function (req, res, next) {
  // no route is matched
  // so call next() to pass to the static middleware
  next();
});

注意:我不建议您将静态文件服务器放在路由器之后,建议您将其放在路由器之前,以便可以定义自己的自定义404路由。



 类似资料:
  • 问题内容: 场景 :考虑以下是节点Web应用程序的代码部分。 问题 :我正在检查公正或公正哪一个。上面的示例代码对两者的工作原理完全相同,并且在执行方面没有任何区别。 问题 : 有人 可以对此加以说明,何时使用和何时使用以及一些重要的区别吗? 问题答案: 有人总是写是为了确保执行在触发回调后停止。 如果您不这样做,则可能要冒第二次触发回调的风险,这通常会造成灾难性的后果。您的代码可以正常使用,但我

  • 描述 (Description) 这不是一个函数,它会导致当前循环迭代跳转到下一个值或控制语句的下一个评估。 不执行当前循环中的进一步语句。 如果指定了LABEL,则执行将跳转到LABEL标识的循环的下一次迭代。 语法 (Syntax) 以下是此函数的简单语法 - next LABEL next 返回值 (Return Value) 此函数不返回任何值。 例子 (Example) 以下是显示其基

  • ++运算符为类String调用此方法。 它会递增给定String中的最后一个字符。 语法 (Syntax) String next() 参数 (Parameters) 没有 返回值 (Return Value) 字符串的新值 例子 (Example) 以下是此方法的使用示例 - class Example { static void main(String[] args) {

  • Next 是一个面向键盘的、可扩展的 Web 浏览器,专为高级用户设计。该应用程序具有键绑定(Emacs,VI),在 Lisp 中是完全可配置和可扩展的,并且对生产专业人员具有强大的功能。 特性: 选项卡的快速切换 通过模糊搜索,可以轻松地在打开的选项卡之间切换。如果你在找https://www.example.com,则只需输入ele, exa,epl,或任何其他匹配的字母序列。 快速导航 Ne

  • 我是Python的初学者,我正试图学习如何使用数据结构,如JSON对象,但我在试图从JSON对象中实际获取数据时遇到了困难。 我可以通过已经有的代码打印文件中的数据,但是我只想打印某个值,比如的值。我如何使用我已经有的代码打印这个?

  • 问题内容: 好吧,我的问题是我想将一些变量从第一个中间件传递给另一个中间件,我尝试这样做,但是有一个“给定为’undefined’”。 问题答案: 将变量附加到对象,而不是。 代替 有: 正如其他人指出的那样,这是通过中间件传递数据的推荐方法。