2015-04-09 5 views
1

По какой-то причине функция обратного вызова никогда не вызывается при попытке сохранить данные в базе данных MongoDB с использованием Mongoose. Сначала я подумал, что код ошибки не был запущен, но затем я проверил, была ли вообще включена функция обратного вызова, и это не так! И ничего не сохраняется в базе данных. Я даже не вижу файл с именем client-db в папке, где хранятся другие базы данных MongoDB (через командную строку) - может быть, проблема?Ошибка обратного вызова Mongoose никогда не достигалась при сохранении

Я пробовал разные решения аналогичных проблем, но до сих пор ничего не работало. У кого-нибудь есть идеи, что я делаю неправильно? Я прибегаю к любой помощи!

Вот соответствующие части моего кода:

клиент-db.js:

var mongoose = require('mongoose'); 
var db = mongoose.connect('mongodb://localhost/client-db', function(){ 
    console.log("Client DB: connected"); // This is shown 
}); 

module.exports = mongoose; 
//module.exports = db; // Another problem was solved by this, but didn't work for me 

сюжетных data.js:

var db = require('client-db'); 

var plotDataSchema = db.Schema({ 
    time: {type: Number, required: true}, 
    value: {type: Number} 
}); 

var PlotData = db.model('PlotData', plotDataSchema); 

module.exports = PlotData; 

controller.js:

var PlotData = require('plot-data'); 

//data is an object with time and value 

var plotData = new PlotData({ 
    time: data.time, 
    value: data.value 
}); 

plotData.save(function(err){ 
    console.log('Entered callback'); // Never shown 
    if(err){ 
    console.log(err); // Never shown 
    //return handleErrror(err); // Different things I tried when I thought the error handling was the problem - didn't change anything 
    //return next(err); 
    }else{ 
    console.log('Plot data saved in client db'); // Never shown 
    } 
}); 
+4

Передача 'err' в качестве параметра в вашем обратном вызове mongoose.connect(), например. 'var db = mongoose.connect ('mongodb: // localhost/client-db', function (err) {'. Затем внутри обратного вызова определяется 'err' и если да, то какое значение? – JoGoFo

+0

Это дало мне ошибка, и я понял, что мне просто нужно вручную запустить mongod из командной строки перед запуском приложения node.js. Проблема решена - спасибо большое :) – KMK

+0

Всегда помогает :) – JoGoFo

ответ

2

Если вы действительно подключены то похоже, что у вас есть условие гонки, которое происходит с соединением БД и операцией сохранения. Конденсация вашего кода в один файл и выполнение сохранения в обратном вызове соединения работает.

var mongoose = require('mongoose'); 
var plotDataSchema = mongoose.Schema({ 
    time: {type: Number, required: true}, 
    value: {type: Number} 
}); 
var PlotData = mongoose.model('PlotData', plotDataSchema); 
var plotData = PlotData({ 
    time: 1234, 
    value: 5678 
}); 

mongoose.connect('mongodb://localhost/client-db', function(err) { 
    if (err) { console.log(err); return; } 
    console.log("Client DB: connected"); // This is shown 

    plotData.save(function(err, plot){ 
    console.log(err, plot); 
    // outputs 
    // null { __v: 0, time: 1234, value: 5678, _id: 5526892bcffa7a0e973fb456 } 
    }); 
}); 

Также несколько заметок о Mongoose в целом:

  • Он имеет внутренний глобальный кэш для моделей, схем и соединений (а также кэш для каждого соединения), поэтому нет необходимости сделайте это: module.exports = mongoose;. Просто требуйте мангуста везде, где вам это нужно (узел также имеет свой собственный кеш, поэтому он будет просто экспортировать уже существующий мангуст в запрашивающий файл).
  • Следуя вышеприведенной точке, из-за этого внутреннего кеша для моделей вам не нужно это делать: module.exports = PlotData. Просто нужно mongoose, а затем вы можете сделать: var PlotData = mongoose.model('PlotData'); для извлечения модели из кеша.

Так что ваши файлы будут выглядеть примерно так:

клиент-db.js

var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/client-db', function(err){ 
    if (err) { console.log(err); return; } 
    console.log("Client DB: connected"); // This is shown 
}); 

сюжетных data.js

var mongoose = require('mongoose'); 
var plotDataSchema = mongoose.Schema({ 
    time: {type: Number, required: true}, 
    value: {type: Number} 
}); 

mongoose.model('PlotData', plotDataSchema); 

controller.js

var mongoose = require('mongoose'); 
var PlotData = mongoose.model('PlotData'); // Notice schema is not specified 

var plotData = new PlotData({ 
    time: data.time, 
    value: data.value 
}); 

// NEED TO WAIT FOR CONNECTION BEFORE CALLING 
plotData.save(function(err, plot){ 
    console.log(err, plot); 
}); 
+0

Спасибо за ваш ответ. Проблема заключалась в том, что база данных не была запущена, но у вас есть хорошие моменты, которые я буду иметь в виду :) – KMK

+1

Нет проблем.Если вы нашли ответ полезным и подумали, что другие пользователи также могли бы пометить его как принятое, чтобы помочь им в случае, если они спотыкаются на этот вопрос? –

+1

Проблема связана с подключением к базе данных, поэтому я считаю, что было бы неправильным отметить это как правильный ответ. Правильный ответ - комментарий JoGoFo. Но я по-прежнему ценю вашу помощь. – KMK

Смежные вопросы