在find.exec()中执行两次回调

时间:2013-12-10 22:42:45

标签: node.js mongoose

所以,我有这段代码:

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中的一次执行两次。

我没有其他地方调用索引方法,所以我真的不明白这一点。

1 个答案:

答案 0 :(得分:2)

您已使用回调作为第一个参数调用api.find。我在api.find的第一行看到你收到此回调,但请注意filter == callback之后。然后,您将过滤器传递给University.model.find,并在回调到exec时调用它。 University.model.find如果它是一个函数,则将其最后一个参数解释为回调函数,因此从该函数调用一次,从回调函数调用一次exec

你需要更加小心解析参数;如果您要将某些内容解释为回调,请不要将其用作其他内容。