【问题标题】:NodeJS server callbacksNodeJS 服务器回调
【发布时间】:2012-03-07 03:54:45
【问题描述】:

我正在为转发部分编写一个带有 express 的 nodeJS REST api 服务器。现在,服务器将要做的部分工作是备份不同类型的数据,并且将请求备份我将支持的某些类型的数据以及我支持的所有请求。为了节省代码重复,我想从处理备份所有内容的请求中调用所有备份单个数据类型函数。

个别类型的数据备份功能。

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,它是每种数据类型的等价物,但是当我可以从syncServiceSync 执行一次时,我会验证每种新数据类型的用户ID。有没有办法做到这一点,并告诉 syncServiceContactsSync 插入数据后要做什么?最好它会与 jsonResponse 一起进入一个函数,我会将它级联到下一个数据类型。

还要注意,这两个文件块是在同一个文件夹的不同文件中。

编辑:为了更容易理解。我有一个系统可以将数据类型 A、B、C 备份到他们自己的 mongo 集合中。我为我的应用程序的注册用户收集了另一个集合。在请求方面,我有一些处理单独备份 A、B、C 的请求,还有一些处理针对特定用户帐户的所有请求。在处理所有这些问题的过程中,我认为使用备份 A、B、C 的函数是一个好主意,因此我没有代码重复。结果,我想要的(但最终可能以不同的方式实现)是,当我想备份所有数据类型时,我只需调用处理 A 的那个,然后级联到那个处理B,然后处理C。除了简单地级联到每个函数之外,我还想级联一些数据(资源ID,所以是As的ID,到处理Bs的函数中,然后是A 和 B 进入处理 C 的函数,然后进入返回所有这些 ID 的最终函数)。我遇到的问题是现在代码的编写方式,每次我级联时,我都会重新检查是否可以在用户集合中找到用户,这有点愚蠢。

【问题讨论】:

    标签: node.js mongodb callback express


    【解决方案1】:

    我不太确定我是否完全理解您的问题,但是您是否查看过 Route Middleware 可用于 Express 路线?更多信息请访问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);
    });
    

    【讨论】:

    • 如果有,请务必将其标记为您问题的答案。
    • @Bill 从您的示例中不清楚 next(new Error(...)) 将如何传递给 app.get('/user/:id') 函数。如何检索传递给 next() 的错误?很高兴看到示例中提到了这一点。
    猜你喜欢
    • 1970-01-01
    • 2016-02-16
    • 2017-12-31
    • 2018-04-25
    • 2017-01-21
    • 2013-06-15
    • 2017-01-05
    • 1970-01-01
    • 2016-08-20
    相关资源
    最近更新 更多