很难理解express.js中的“next / next()”

这是一个例子:

// 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); }); }); 

从build立在节点上的简单便笺簿取得

这些令我困惑的问题是:

  1. 什么是next/next(); 做? 如果不存在会发生什么?
  2. 为什么第二部分以下next为参数,第一个不是?

编辑:

Express使用具有callback函数的中间件函数(在动作完成时调用的函数),接下来有这个目的(这是一个触发Express栈中下一个中间件的callback函数)。 所有Express中间件(即连接兼容)有3个参数:请求,响应,下一个(这是可选的)。

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

每个中间件都可以完成它的任务,如果满足一些条件,就调用队列中的next中间件(例如静态中间件不会调用下一个中间件,因为它会照顾自己服务这些文件,这样路由器就赢了不会被叫到)。

在路由器中,你通常不会调用next因为它往往是最后执行的中间件(除非你想要类似基准的东西)。

如果你想创build一个拒绝所有未login用户访问的中间件,只有当用户login时才需要调用next() ,这样下一个中间件被调用,路由器和用户可以访问他们正在寻找的页面),否则你可能会redirect到login页面。

next根本不需要任何参数,或者将错误作为参数。

编辑:根据你的configuration,路由器在静态中间件之前,所以如果你想要文件被服务,你需要声明一个通配符路由,当路由不匹配时调用next():

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

注意:我不推荐你在路由器后面放置静态文件服务器,我build议你把它放在之前,这样可以定义你自己的自定义404路由。