2012-02-15 94 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