Почему эта простая программа Mongoose.js зависает при выполнении «вложенного» сохранения? - PullRequest
2 голосов
/ 11 декабря 2011

[править]: я обновил предыдущий вопрос этим, используя очень специфический воспроизводимый пример.

Это вся моя программа.

Я создаю две схемы ASchema и BSchema с коллекциями A и B соответственно, создаю два объекта a и b и пытаюсь сохранить их последовательно - то есть сначалаa затем b.

mongoose = require('mongoose'),
    Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/test');

ASchema = new Schema({
    text: String
});

BSchema = new Schema({
    val: Number
});

A = mongoose.model('A', ASchema);
B = mongoose.model('B', BSchema);

a = new A({text: 'this is a'});
b = new B({val: 5});

a.save(function(err) {
    if(err) console.log(err.message);
    else {
        console.log('saved a : ', a);
        b.save(function(err) {
            if(err) console.log(err.message);
            else {
                console.log('saved b : ', b);
            }
        });
    }
});

mongoose.disconnect();

То, что я ожидаю, должно произойти:
Должно быть напечатано saved a :, за которым следует документ a, а затем saved b :,сопровождаемый документом b.

Что на самом деле происходит:
Печатается saved a : { text: 'this is a', _id: 4ee4cab00d2c35fc04000001 } и ничего более.Программа также не останавливается;он остается «застрявшим».
Просматривая оболочку mongo, я обнаружил, что коллекция as (a во множественном числе mongoose, это нормально) была создана, и я могу увидеть в ней сохраненный документ с db.as.find().Однако я не могу найти коллекцию bs.

Твик:
В коде сохранения меняются местами a и b (порядок сохранения) причинb для сохранения и a для сохранения.Так что проблема конкретно не в a или b.

Вопрос: Почему не сохраняется следующий документ?

Ответы [ 2 ]

5 голосов
/ 11 декабря 2011

Ответ очень прост, посмотрите на вашу последнюю строку:

mongoose.disconnect();

Вы не должны этого делать, поскольку все еще есть запросы, которые нужно обработать, и вы не знаете, когда (в нашем случае это второй запрос).Так что происходит, когда выполняется первый запрос, Mongoose отключается, а второй зависает.

Решение

Удалить последнюю строку на путе mongoose.disconnect(); после последнейзапрос выполняется.

0 голосов
/ 24 января 2013
mongoose.disconnect();  //Do not do this as async methods keep running in background.

Не открывать + закрывать соединение для каждого запроса.

Откройте соединение один раз и используйте его снова.

Я предпочитаю следующий способ:

MongoDBconObj.open(function(err, db) {
    //re-use db 
    // All your application codes goes here...
    //..
    http.createServer(onRequest).listen(8080);
    console.log("HTTP is listening on 127.0.0.1:8080 ");
  }); 

См. Ссылку для получения наилучшей практики

https://groups.google.com/forum/#!topic/node-mongodb-native/5cPt84TUsVg

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...