的問題是,在發送響應後,你不刪除事件處理程序。 on()
保留事件處理程序,直到它們被明確刪除。因此,對於每個連接,都會添加新的事件處理程序,但不會刪除。
即使您使用的是.once()
而不是.on()
,您仍然需要移除其他未觸發事件的處理程序。
恕我直言,你最好只使用一個回調,而不是使事件發生器複雜化。例如:
型號/ authenticate.js:
// ...
exports.checkUser = function(data, cb) {
UsersDB.findOne({ fbid: data.id }, function(err, doc) {
if (err)
return cb(err);
if (doc === null)
insertUser(data, cb);
else
cb(null, 'Authenticated', doc);
});
};
var insertUser = exports.insertUser = function(data, cb) {
var insertData = {
fbid: data.id
first_name: data.first_name
last_name: data.last_name,
email: data.email,
created_at: new Date()
};
UsersDB.insert(insertData, function(err, doc) {
if (err)
return cb(err);
cb(null, 'Registered', doc);
});
};
控制器/ authenticate.js:
// ...
model.authenticate(req.body, function(err, action, data) {
if (err)
return res.json({ error: err });
res.json({ action: action, userData: data });
});
此外,您還可以簡化您的 「檢查並插入」 邏輯使用MongoDB的「upsert」功能,將爲您執行兩個步驟,而不是進行兩次單獨的數據庫調用。要了解如何做到這一點,請看this SO answer。
提示:發佈代碼和錯誤文本比發佈上述項目的截圖要好得多,特別是如果有人想嘗試在本地重現問題時更是如此。 – mscdex