【问题标题】:the use of Next() in a node.js controller在 node.js 控制器中使用 Next()
【发布时间】:2014-05-25 23:06:10
【问题描述】:

我正在关注精彩的 node-express-mongoose-demo 应用程序 (link

在articles.js 控制器中,.load 函数有一个next() 语句,我对此感到困惑——我认为next() 仅用于路由,将流传递给下一个中间件。为什么在控制器内部使用 next()?为什么其他控制器功能(例如 .edit ,请参见下面的代码)不使用 next()..?

 /**
 * Module dependencies.
 */

var mongoose = require('mongoose')
  , Article = mongoose.model('Article')
  , utils = require('../../lib/utils')
  , extend = require('util')._extend

/**
 * Load
 */

exports.load = function(req, res, next, id){
  var User = mongoose.model('User')

  Article.load(id, function (err, article) {
    if (err) return next(err)
    if (!article) return next(new Error('not found'))
    req.article = article
    next()
  })
}

....

/**
 * Edit an article
 */

exports.edit = function (req, res) {
  res.render('articles/edit', {
    title: 'Edit ' + req.article.title,
    article: req.article
  })
}

【问题讨论】:

    标签: node.js express functional-programming


    【解决方案1】:

    .load 中间件调用next(),因为它是parameter middleware。这些特殊的中间件允许您为特定的路由参数执行逻辑。如果您有类似/users/:id 的路由,这会很方便,您可以在其中为id 设置参数中间件,从数据库加载该特定用户的配置文件,然后继续到实际的路由处理程序(现在有用户的配置文件已经可用)。如果没有这个,您可能会发现自己在路由处理程序中为同一路由路径的不同 HTTP 动词重复相同的加载逻辑。

    普通的路由处理程序(例如edit)不使用next(),因为它们不需要(除非您遇到严重的类似HTTP 500 的错误并想调用next(err))。它们通常是将响应发送回客户端。

    【讨论】:

      【解决方案2】:

      这是因为路由中的命名参数。

      例如对于像这样的路线

      app.get('/articles/:id/edit', ArticleController.edit)
      

      我们必须通过设置app.param('id', ArticleController.load)来告诉路由解析“id”

      这将继续并使用 load 方法加载文章,然后调用 next() 将控件传递给编辑函数。 “加载”充当加载文章并使其在编辑方法中可用的中间件。

      更多详情请查看express routing

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-03
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        • 2015-05-12
        • 1970-01-01
        • 2012-07-07
        • 2021-01-01
        相关资源
        最近更新 更多