在node.js控制器中使用Next()

时间:2014-05-25 11:53:05

标签: node.js express functional-programming

我正在关注精彩的node-express-mongoose-demo app(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
  })
}

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

例如

之类的路线
app.get('/articles/:id/edit', ArticleController.edit)

我们必须通过设置app.param('id', ArticleController.load)

告诉路由解析“id”

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

有关详细信息,请参阅express routing