2015-02-21 2 views
1

я получил этот код в клиенте Монго, который производит то, что я ожидал:запросов внутри запроса терпит неудачу с узлом родной драйвер

db.bookings.find().forEach(
    function(booking) { 
     booking.visitor = db.visitor.findOne({id:booking.visitor_id}); 
     db.bookingsReloaded.insert(booking) 
    } 
) 

Код в узле 10.x и Монго родной драйвер (v2.1.x) выглядит следующим образом:

bookings.find({}).each(
function(err, booking){ 
    if (booking == null){ 
     ... 
    } else { 
     booking.visitor = booking.findOne({id:booking.visitor_id}); 
     bookingsReloaded.insert(booking);   
    } 
}); 

Хотя после исполнения коды (заказов и посетителей являются существующими коллекциями) новая коллекция bookingsReloaded содержит ожидаемые результаты (посетитель док встроенный) при выполнении с клиентом Монго, код узла Безразлично Не работает, похоже, он даже не выполняет findOne s tatement.

Вероятно, что-то тривиальное, что я должен был знать, но я не :(

ответ

0

оболочка Монго клиент является синхронным, в то время как Node.js является асинхронным. Таким образом, результат findOne вызова доставляется через обратный вызов ., а не вернулся

Так что ваш node.js код должен был бы выглядеть вместо этого:..

bookings.find({}).each(
    function(err, booking){ 
     if (booking == null){ 
      ... 
     } else { 
      visitors.findOne({id: booking.visitor_id}, function(err, visitor) { 
       booking.visitor = visitor; 
       bookingsReloaded.insert(booking, function (err, inserted) { 
        ...error handling... 
       });   
      }); 
     } 
    }); 
+0

Джонни - спасибо за ответ к сожалению, это не решает проблему, я изменил код так что вставка находится внутри вызова findOne. wever, результат состоит в том, что код функции, вызываемой в findOne, не выполняется ... –

+0

@RalphMueller Лучше всего добавлять комментарии, чтобы уточнить вместо редактирования ответов. В любом случае, спасибо за разъяснение, что это коллекция 'visitors', которая запрашивает' findOne'. Должен ли 'findOne' запрашивать поля' _id' вместо 'id'? – JohnnyHK

+0

Упс, извините, я новичок. Во всяком случае - я перевел имена коллекций с немецкого языка для лучшего понимания. Так что это действительно visitors.findOne с идентификатором для посетителя, хранящегося в коллекции заказов. Тот же самый запрос visit.findOne работает, если я просто поставлю его в начале моего маленького тестового приложения, но не внутри кода, как показано в примере (теперь с помощью команды insert в функции, вызываемой findOne –