web-dev-qa-db-fra.com

Le rappel Mongoose.js instance.save () ne se déclenche pas

var mongo = require('mongoose');
var connection = mongo.createConnection('mongodb://127.0.0.1/test');

connection.on("error", function(errorObject){
  console.log(errorObject); 
  console.log('ONERROR');
});

var Schema = mongo.Schema;
var BookSchema = new Schema({ title : {type : String, index : {unique : true}}});
var BookModel = mongo.model('abook', BookSchema);
var b = new BookModel({title : 'aaaaaa'});

b.save( function(e){ 
  if(e){
    console.log('error')
  }else{
    console.log('no error')
}});

Ni "l'erreur", ni "aucune erreur" ne sont imprimées sur le terminal. De plus, l'erreur de connexion.on ne semble pas se déclencher non plus. J'ai confirmé que MongoDb est en cours d'exécution.

24
LDK

dans ce cas, vous ajoutez le modèle à l'objet global mongoose mais ouvrez une connexion distincte mongo.createConnection() à laquelle les modèles ne font pas partie. Comme le modèle n'a pas de connexion, il ne peut pas enregistrer sur la base de données.

ceci est résolu soit en se connectant à mongo sur la connexion globale de mangouste:

var connection = mongo.createConnection('mongodb://127.0.0.1/test');
// becomes
var connection = mongo.connect('mongodb://127.0.0.1/test');

ou en ajoutant vos modèles à votre connexion séparée:

var BookModel = mongo.model('abook', BookSchema);
// becomes
var BookModel = connection.model('abook', BookSchema);
66
aaronheckmann

J'aime beaucoup la réponse d'Aaron, et grâce à lui, je suis en train de régler le problème ... même si je n'y suis pas encore! Voici mon problème particulier:

Je souhaite que mon schéma et mes modèles soient définis dans des fichiers distincts, afin de pouvoir les réutiliser d'un projet à l'autre. Donc, à titre d'exemple, j'ai un fichier nommé W8DBItem.js comme suit:

var mongoose = require('mongoose');
var itemSchema = new mongoose.Schema({ name: {type: String, required: true}});
module.exports = mongoose.model('W8DBItem', itemSchema);

Dans mon fichier de programme, je fais ceci:

var mongoose = require('mongoose');
var W8DBItem = require('../w8/W8DBItem.js'); 
var dbURL ='mongodb://localhost:27017/default';
var mongoOptions = { useNewUrlParser: true, bufferCommands: false }
mongoose.connect(dbURL, mongoOptions);

var db = mongoose.connection;

// DEAL WITH CONNECTION ERROR
db.on('error', console.error.bind(console, 'connection error:'));

// PREP DATA
var aWeight = { name: "My Test Name" };
var newWeightItem = W8DBItem(aWeight);

// CONNECTION ESTABLISHED
db.once('open', function() {
    console.log("Here 1")

    // TRY TO SAVE
   newWeightItem.save(function (err, newWeightItem) {
    if (err) { 
        console.log("Here 2");
        console.log(err);
    }
    else {
        console.log("Here 3");
        console.log(newWeightItem);
    }
  });
});

Quand je lance ce programme, je reçois "Ici 1" mais jamais "Ici 2" ou "Ici 3" dans la console. 

Le message d'Aaron m'indique que l'objet W8DBItem n'a pas de connexions associées (et ouvertes), mais je ne suis pas sûr de savoir comment y remédier. Je pourrais me connecter à la base de données dans le fichier W8DBItem.js , mais je n'aime vraiment pas coder en dur les informations du serveur avec les objets. Je souhaite que ces objets soient utilisés dans différents fichiers, et peut-être avec différents serveurs. .

Les idées et les suggestions sont très appréciées!

[EDIT: SOLUTION TROUVÉE !!!]

Au lieu d'exporter mon mongoose.model à partir de mon fichier objet, je n'exporte que le schéma: 

var mongoose = require('mongoose');
var itemSchema = new mongoose.Schema({name: {type: String, required: true}});
module.exports = itemSchema;

Dans mes fichiers de programme, je fais ensuite ceci:

var itemSchema = require('../w8/W8DBItemSchema.js'); 
...

var W8DBItem = db.model('W8DBItem', itemSchema);
var newWeightItem = W8DBItem(aWeight);
...

Fonctionne comme un charme. J'espère que ça aidera quelqu'un!

0
Tom D.

La réponse affichée ne résout pas le problème. Malheureusement, je ne peux pas simplement mettre à niveau ma base de données, ce n'est donc pas une solution pour moi non plus. Mais ici, j'ai trouvé une solution à ce problème: https://github.com/Automattic/mongoose/issues/4064

Utilisez simplement .$__save au lieu de .save comme indiqué: 

var b = new BookModel({title : 'aaaaaa'});

b.$__save({}, function(e){ 
  if(e){
    console.log('error')
    // callback will show if e exists
  }else{
    console.log('no error')
    // callback will show 'no error'
}});
0
ttemple