2015-12-22 98 views
0

我正在試圖在這個平臺上創建我的第一個應用程序,並將它放在nodejs上。在圖片上的這段代碼中,我是來自post請求,我試圖檢查發送給我的userData是否已經註冊。如果不是,它將註冊用戶。爲了最大限度地減少回調,我將使用事件來告訴我我調用的函數是否完成。在這種情況下,如果圖像右側的checkUser函數屬性,如果db發現用戶,它將發出寫在左邊的userAuthenticated事件。如果不是,它會寫入用戶併發出userRegistered事件。EventEmiter觸發一次,請求失敗後

問題是,它有時它的工作原理,有時它不。這是我第一次在節點上編寫異步函數,而且我很難理解它的功能。

+0

提示:發佈代碼和錯誤文本比發佈上述項目的截圖要好得多,特別是如果有人想嘗試在本地重現問題時更是如此。 – mscdex

回答

1

的問題是,在發送響應後,你不刪除事件處理程序。 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

+0

我設法通過使用res.end()而不是res.json()來解決這個問題,但你也是一個不錯的選擇。相反,我也處於承諾之中。但由於代碼現在很簡單,它似乎是正確的選擇。 –