2012-02-15 87 views
0

我正在寫一個nodeJS REST api服務器,具有express的轉發部分。現在服務器要做的一部分就是備份不同類型的數據,並且會要求備份我支持的某些類型的數據以及我支持的所有請求。爲了節省代碼重複,我想從請求中調用所有備份個人類型的數據函數來處理所有事情。NodeJS服務器回調

單獨類型的數據備份功能。

function verifyUserId(req, res, functionToGoTo) { 

    req.mongoClient.collection('syncServiceAccounts', checkForAccount = function (err, collection) { 
     collection.find({_id:req.objectID.createFromHexString(req.params.syncServiceUser)}).toArray(function (err, results) { 
      if (results.length != 0) { 
       functionToGoTo(req, res, results[0].share_key); 
      } else { 
       res.send(404); 
      } 
     }); 
    }); 
}; 
    //Set all server contacts as on device 
exports.syncServiceContactsSync = function (req, res) { 
    console.log('syncServiceContactsSync'); 
    verifyUserId(req, res, syncServiceContactsSync, sendContactsSyncResponse); 
    //verifyUserId(req, res, syncServiceContactsSync); 
}; 
function syncServiceContactsSync(req, res, shareKey, callback) { 
//function syncServiceContactsSync(req, res, shareKey) { 
    jsonObject = (req.body); 
    var jsonResponse = new Array(); 

    req.mongoClient.collection('syncService_Contacts', insertSyncServiceUser = function (err, collection) { 
     collection.remove({share_key:shareKey}); 

     for (var i = 0; i < jsonObject.length; i++) { 
      jsonObject[i].share_key = shareKey; 
      collection.insert(jsonObject[i]); 
     } 

     collection.find({share_key:shareKey}).toArray(function (err, results) { 
      for (var i = 0; i < results.length; i++) { 
       jsonResponse.push({contactID:results[i]._id}); 
      } 
      //res.json(jsonResponse, 200); 
      callback(); 
     }); 
    }); 
}; 
function sendContactsSyncResponse() { 
    res.json(jsonResponse, 200); 
} 

而在下面的函數中,我希望能夠調用所有單獨的備份類型。

//Set all server items as on the device 
exports.syncServiceSync = function (req, res) { 
    console.log('syncServiceSync'); 
    contactsObj = new Contacts(); 
    contactsObj.syncService 

}; 

我可以調用導出syncServiceContacsSync和它的等價物爲每種類型的數據,但後來我想驗證用戶ID爲每個新的數據類型,當我可以從syncServiceSync做一次的。有沒有辦法做到這一點,並告訴syncServiceContactsSync插入數據後該做什麼?最好它會和jsonResponse一起發送到一個函數,在那裏我會將它串聯到下一個數據類型中。

另請注意,兩個文件塊位於同一文件夾中的不同文件中。

編輯:使其更容易理解。我有一個將數據類型A,B,C備份到他們自己的mongo集合中的系統。我有另一個爲我的應用程序註冊用戶的集合。在請求方面,我有一些涉及單獨備份A,B和C的處理方法,以及針對特定用戶帳戶處理所有這些問題的處理方法。在處理所有這些問題的人中,我認爲使用備份A,B,C的函數是一個好主意,所以我沒有代碼重複。因此,我想要的(但最終可能會以不同的方式實現)是,當我想要備份所有的數據類型時,我只需調用處理A的數據類型,然後級聯到一個處理B,然後是C處理。除了簡單地串聯到每個函數之外,我還想將一些數據(資源ID,所以As的ID,放入處理Bs的函數中,然後將ID A和B轉換爲處理C的函數,然後轉換爲返回所有這些ID的最終函數)。我遇到的問題是,現在編寫代碼的方式,每次級聯時,我都會重新檢查是否可以在用戶集合中找到用戶,而這只是一種愚蠢的做法。

回答

0

我不太清楚我是否完全理解您的問題,但是您是否已查看路線中可用的Route Middleware?更多信息請見http://expressjs.com/guide.html#route-middleware

它基本上允許您將邏輯插入到請求管道中,以便您可以在一個地方定義邏輯並將其用於多個路由。

function loadUser(req, res, next) { 
    // You would fetch your user from the db 
    var user = users[req.params.id]; 
    if (user) { 
    req.user = user; 
    next(); 
    } else { 
    next(new Error('Failed to load user ' + req.params.id)); 
    } 
} 

app.get('/user/:id', loadUser, function(req, res){ 
    res.send('Viewing user ' + req.user.name); 
}); 
+0

如果是這樣,請務必將其標記爲您的問題的答案。 – Bill 2012-02-15 19:44:37

+0

是的,會做的,不要擔心。 – 2012-02-15 21:05:27

+0

@Bill從您的示例中不清楚下一個(新的錯誤(...))是如何集中到app.get('/ user /:id')函數的。如何獲取傳遞給next()的錯誤?很高興看到這個例子中提到的這一點。 – titusmagnus 2013-09-28 15:55:05