我正在关注精彩的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
})
}
答案 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)
这将继续使用load方法加载文章,然后调用next()将控件传递给edit函数。 “加载”充当中间件,加载文章并使其在编辑方法中可用。
有关详细信息,请参阅express routing。