所以,我有这段代码:
api.find = function(filter, sort, skip, limit){
var callback = typeof arguments[arguments.length - 1] === 'function'? arguments[arguments.length - 1] : function(){};
University.model.find(filter).sort(sort).skip(skip).limit(limit).exec(function(err, universities){
console.log('callbacking api.find');
callback(err, universities);
})
};
和
controller.index = function(req, res){
api.find(function(err, universities){
console.log('callbacking controller.index');
req.pageTitle = 'Universities';
req.universities = universities;
res.render('list.html', req);
});
};
和
app.get('/universities/', controller.index);
当我加载/大学时我收到错误:
Error: Can't set headers after they are sent.
api.find中的console.log执行一次,但controller.index中的一次执行两次。
我没有其他地方调用索引方法,所以我真的不明白这一点。
答案 0 :(得分:2)
您已使用回调作为第一个参数调用api.find
。我在api.find
的第一行看到你收到此回调,但请注意filter == callback
之后。然后,您将过滤器传递给University.model.find
,并在回调到exec
时调用它。 University.model.find
如果它是一个函数,则将其最后一个参数解释为回调函数,因此从该函数调用一次,从回调函数调用一次exec
。
你需要更加小心解析参数;如果您要将某些内容解释为回调,请不要将其用作其他内容。