nodejs, mongodb - Как мне работать с данными из нескольких запросов? - PullRequest
1 голос
/ 10 января 2011

Я новичок в JS в целом, но я пытаюсь запросить некоторые данные из MongoDB.По сути, мой первый запрос извлекает информацию для сеанса с указанным идентификатором сеанса.Второй запрос выполняет простой геопространственный запрос для документов, расположенных рядом с указанным местоположением.

Я использую драйвер javascript mongodb-native.Все эти методы запроса возвращают свои результаты в обратных вызовах, поэтому они не блокируются.Это корень моих неприятностей.Что мне нужно сделать, это получить результаты второго запроса и создать массив сессионных идентификаторов всех возвращенных документов.Затем я собираюсь передать их функции позже.Но я не могу сгенерировать этот массив и использовать его где-нибудь за пределами обратного вызова.

Кто-нибудь знает, как правильно это сделать?

db.collection('sessions', function(err, collection) {
  collection.findOne({'sessionId': client.sessionId}, function(err, result) {
    collection.find({'geolocation': {$near: [result.geolocation.latitude, result.geolocation.longitude]}}, function(err, cursor) {
      cursor.toArray(function(err, item) {

      console.log(item);
    });
  });
});

Ответы [ 2 ]

6 голосов
/ 10 января 2011

Функции - это единственная вещь в javascript, которая «заключает» область видимости.

Это означает, что переменные элементы в вашей внутренней функции обратного вызова не доступны во внешней области видимости.

Вы можете определить переменную во внешней области видимости, чтобы она была видна всем внутренним областям:

function getItems(callback) {
  var items;

  function doSomething() {
    console.log(items);
    callback(items);
  }

  db.collection('sessions', function(err, collection) {
    collection.findOne({'sessionId': client.sessionId}, function(err, result) {
      collection.find({'geolocation': {$near: [result.geolocation.latitude, result.geolocation.longitude]}}, function(err, cursor) {
        cursor.toArray(function(err, docs) {
          items = docs;
          doSomething();
         });
       });
     });
   });
}
0 голосов
/ 26 октября 2011

Node.js асинхронный, поэтому ваш код должен быть написан так, чтобы он соответствовал.

Я нашел эту модель полезной.Каждый вложенный беспорядок обратного вызова заключен в вспомогательную функцию, которая вызывает аргумент обратного вызова «next» с кодом ошибки и результатом.

function getSessionIds( sessionId, next ) {
    db.collection('sessions', function(err, collection) {
      if (err) return next(err);
      collection.findOne({sessionId: sessionId}, function(err, doc) {
          if (err) return next(err);
          if (!doc) return next(false);
          collection.find({geolocation: {$near: [doc.geolocation.latitude, result.geolocation.longitude]}}.toArray(function(err, items) {
              return next(err, items);
          });
      });
    });
}

Затем в вашем коде вызова

getSessionIds( someid, _has_items);
function _has_items(err, items) {
   if( err ) // failed, do something
   console.log(items);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...