2014-01-06 74 views
0

我正在使用express和mongoose。當我使用mocha測試來運行此端點時,我有一個奇怪的問題。使用貓鼬和異步時快速響應不起作用

exports.broadcastMessages = function(req, res, next) { 
    User.find({}, function(err, users) { 
    if(err) return next(err); 

    var push = function(user, callback) { 
     user.messages.push(req.body.message); 
     user.save(function(err) { 
     callback(err); 
     }); 
    }; 

    var fin = function(err) { 
     if (err) { 
     return next(err); 
     } 
     console.log('aaaaaaaaaa'); 
     return res.send('ok'); 
    }; 

    async.each(users, push, fin); 
    }); 
}; 

然後我得到一個超時錯誤。只有一個用戶。所以這不是時間問題。我確信res.send('ok')被調用。但是當我刪除user.save()。它的工作...

exports.broadcastMessages = function(req, res, next) { 
    User.find({}, function(err, users) { 
    if(err) return next(err); 

    var push = function(user, callback) { 
     user.messages.push(req.body.message); 
     callback(err); 
    }; 

    var fin = function(err) { 
     if (err) { 
     return next(err); 
     } 
     console.log('aaaaaaaaaa'); 
     return res.send('ok'); 
    }; 

    async.each(users, push, fin); 
    }); 
}; 

我不知道爲什麼。爲什麼添加一個user.save()它不起作用? res.send被調用,但沒有響應。

express的版本是3.4.7。貓鼬是3.8.2。

回答

0

當你說「我有一個超時錯誤」,你的意思是摩卡沒有通過測試時間過長?如果是這樣,可能是您的摩卡測試本身沒有正確調用done()的問題。上面的代碼對我來說看起來不錯,我認爲它應該可以工作。一些雜項要點:

只要你有這個模式:

user.save(function(err) { 
    callback(err); 
}); 

你並不需要額外的包裝函數,它只是調用回調。只要做到:

user.save(callback); 

而且,通過用戶循環,節約每一個不僅僅是有MongoDB的效率要低得多做所有你在一個單一的命令:

User.update({}, {$push: {messages: req.body.message}}, function (error) {...}); 
+0

哦,是的,哈哈我忘了打電話在摩卡測試中完成()。非常感謝! –