Обратные вызовы сервера NodeJS - PullRequest
0 голосов
/ 15 февраля 2012

Я пишу RI-сервер nodeJS REST с Express для пересылки.Теперь часть того, что будет делать сервер, - это резервирование различных типов данных, и будут запросы на резервное копирование определенных типов данных, которые я буду поддерживать, и все запросы, которые я поддерживаю.Чтобы сэкономить на дублировании кода, я думал о том, чтобы просто вызвать все функции резервного копирования отдельных типов данных из запроса, который касается резервного копирования всего.

Индивидуальный тип функций резервного копирования данных.

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 и его эквиваленты для каждого типа данных, но затем я бы проверил userID для каждого нового типа данных, когда я мог сделать это один раз из syncServiceSync.Есть ли способ сделать это, и сказать syncServiceContactsSync, что делать, когда он вставил данные?Предпочтительно, чтобы она шла к функции вместе с jsonResponse, где я бы каскадировал ее в следующий тип данных.

Также отметим, что два блока файлов находятся в разных файлах в одной папке.

РЕДАКТИРОВАТЬ: чтобы было легче понять.У меня есть система, которая выполняет резервное копирование типов данных A, B, C в свои собственные коллекции монго.У меня есть другая коллекция для зарегистрированных пользователей для моего приложения.Что касается запросов, у меня есть некоторые, которые имеют дело с резервным копированием A, B, C по отдельности, и одна, которая касается всех из них для конкретной учетной записи пользователя.В том, что касается всех из них, я подумал, что было бы неплохо использовать функции, которые поддерживают A, B, C, чтобы у меня не было дублирования кода.В результате я хотел бы (но это могло бы быть реализовано по-другому), чтобы когда я хотел сделать резервную копию всех типов данных, я бы просто вызвал тот, который имеет дело с A, и затем каскадом перешел к одномукоторый имеет дело с B, а затем с C. Помимо простого каскадирования в каждую функцию, я также хотел бы каскадировать некоторые данные (идентификатор ресурса, то есть идентификаторы As, в функцию, которая работает с B, затем идентификаторыA и B в тот, который имеет дело с C, а затем в конечную функцию, которая возвращает все эти идентификаторы).Проблема, с которой я столкнулся, заключается в том, что при написании кода теперь каждый раз, когда я каскадируюсь, я проверяю, могу ли я найти пользователя в коллекции пользователей, и это просто глупо.

1 Ответ

0 голосов
/ 15 февраля 2012

Я не совсем уверен, что полностью понимаю ваш вопрос, но вы изучили 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);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...