2016-07-19 2 views
1

Я начинаю работать с node.js и mongoose и полным стеком в целом. Я бил голову над созданием базы данных и общением с моим сервером и не мог заставить ее работать. Я не согласен с этим руководством: Easily Develop Node.js and MongoDB Apps with MongooseФункция Mongoose .save, похоже, не вызывает вызов в скрипте node.js

В любом случае, мои файлы организованы довольно просто на данный момент. Мой сервер.js находится в том же каталоге, что и папка «models», в которой содержится файл «testSchema.js».

У меня есть сценарий, который можно вызвать нажатием кнопки в файле server.js.

var mongoose = require('mongoose'); 
var mongoURL = "mongodb://username:[email protected]:27017/test"; 
mongoose.connect(mongoURL); 

var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function() { 
    console.log("We have connected"); 
    var Item = require("./models/testSchema"); 
    var newItem = Item({ 
     name: 'Peter', 
     score: 5 
    }); 
    newItem.save(function(err) { 
     if (err) throw err; 
     console.log("Item Created"); 
    }); 

}); 
mongoose.connection.close(); 

Это должно добавить образец образца в мою модель. И, наконец, testSchema.js:

var Schema = mongoose.Schema; 
var ItemSchema = new mongoose.Schema({ 
    name: { 
     type: String, 
     index: true 
    }, 
    score : Number 
}); 

var Item = mongoose.model('Item', ItemSchema); 

module.exports = Item; 

Так что, когда я бегу сценарий, я получаю сообщение, но не сообщение «создано Item», ни какой-либо журнал ошибок, которые придут «Мы подключили!» после вызова функции .save. Казалось бы, это просто пропущено, но я не знаю, как ведут себя мангусты и node.js в этом контексте. Является ли даже вызов?

Дополнительно: Моя база данных mongoDB размещена на Openshift, но я перенаправлял порт на localhost, и похоже, что он работает нормально. Когда я вызываю скрипт, я получаю сообщение «Обработка соединения для 27017».

Любая помощь была бы принята с благодарностью!

** редактировать **

Я не могу комментировать, так что я буду просто редактировать свой пост.

Захири Якоби и ответы Роберта Клепа сделали трюк! Большое вам спасибо, я не знал, что узел такой асинхронный.

+1

Вы закрыть соединение до того, как 'open' событие увольняют. Это в конечном счете связано с тем, как асинхронные операции работают в узле (где операция может еще не завершиться при выполнении следующей строки кода). – robertklep

ответ

2

Узел является асинхронным при вводе/выводе, поэтому все не обязательно произойдет в том порядке, в котором они отображаются в коде.

Здесь соединение с базой данных открывается, и узел переходит к следующему оператору, не дожидаясь завершения остальной части кода в обратном вызове. Таким образом, mongoose.connection.close(); фактически выполнен до newItem.save(function(err) {....

Чтобы исправить это, попробуйте:

var mongoose = require('mongoose'); 
var mongoURL = "mongodb://username:[email protected]:27017/test"; 
mongoose.connect(mongoURL); 

var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function() { 
    console.log("We have connected"); 
    var Item = require("./models/testSchema"); 
    var newItem = Item({ 
     name: 'Peter', 
     score: 5 
    }); 
    newItem.save(function(err) { 
     if (err) throw err; 
     console.log("Item Created"); 
     mongoose.connection.close(); 
    }); 

}); 
Смежные вопросы