web-dev-qa-db-fra.com

Instance Mongoose .save () ne fonctionne pas

J'ai un problème avec Mongoose et MongoDb

Il est très intéressant que seuls Model.update fonctionne et que save ne fonctionne jamais et ne déclenche même pas de rappel.

Mongoose: 4.4.5 MongoDB: 3.0.8

Express Route

var mongoose = require('mongoose');
mongoose.connect("mongodb://127.0.0.1:27017/db");
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function(callback) {
    console.log("connection to db open")
});
var User = require("../models/user.js");

Modèle d'utilisateur

var user = new Schema({
    uid: { type: Number, required: true, unique: true},
    hwid: { type: String, default:""},
    bol:{type:String,default:""}
});

Update Enpoint

Version de travail: Model.update ()

User.update({_id: id}, {
    uid: 5, 
}, function(err, numberAffected, rawResponse) {
    console.log(err);
})

Version ne fonctionne pas et je dois résoudre ce problème: Object.save ()

User.find({_id:id}, function(err,user){
    if(err){
         console.log(err);
    }
    if(!user){
         console.log("No user");
    }else{
        user.uid = 5;
        user.save(function(err,news){
            console.log("Tried to save...");
        });
    }
    console.log("At least worked");
})

Même rappel ne déclenche pas. La connexion s'ouvre avec succès. Il n'invoque jamais de rappel. 


  1. J'ai essayé d'utiliser var User = connection.model('User', schema) n'a pas fonctionné.
9
Ahmet Can Güven

Je ne vais pas supprimer cette question parce que les gens peuvent aussi rencontrer ce problème. En réalité, le problème n'était pas lié à MongoDb ou Mongoose. Lorsque vous appelez la chaîne de responsabilité Object.save(), la situation est la suivante:

  1. Schema.pre ("enregistrer")
  2. Enregistrer les données sur dabe
  3. Schema.post ("save")

Donc, si vous bloquez pre("save") et n'appelez pas le gestionnaire next(), vous ne pourrez pas enregistrer votre document. C'était mon cas, j'ai oublié l'appel next() dans une instruction if et j'ai essayé de trouver l'erreur pendant plus de 3 heures.

user.pre("save", function(next) {
    if(!this.trial){
        //do your job here
        next();
    }
}

Lorsque this.trial == true, le prochain gestionnaire ne sera pas accessible. 

Pour éviter de telles erreurs, nous devons nous occuper de la couverture des succursales. Les journalistes peuvent nous montrer des codes non testés. Votre problème pourrait être lié à cela aussi. Assurez-vous d'appeler next() si votre document doit être enregistré.

Version fixe

user.pre("save", function(next) {
    if(!this.trial){
        //do your job here
    }
    next();
}
17
Ahmet Can Güven

Cela semble fou ... et j'essaie de résoudre ce problème depuis des heures. Vu tant de messages de débordement de pile… c'est incroyable.

Et vous savez ce que c'était? Je ne spécifiais pas la base de données à la fin de l'URL.

Donc au lieu de 

"mongodb://127.0.0.1:27017/test"

J'ai eu

"mongodb://127.0.0.1:27017

J'ai perdu une journée entière à ce sujet. J'aurais vraiment aimé qu'on me donne des erreurs. L'enregistrement d'un enregistrement est toujours rentré. Et dans le journal de la base de données, je me connectais bien. Mais j'avais vraiment besoin de regarder les détails. Oui, il se connectait à l'instance mongo, mais pas à la base de données elle-même. Pouah!

2
Salx

Comme dit Paul. Très probablement, vous appelez save sur l'objet 'req.user', qui n'est pas un objet Mongoose. Assurez-vous de faire quelque chose comme ça:

//I am using your 'user' schema
var userModel = mongoose.model('User', user);
var User = mongoose.model('User');
var newUser = new User(req.user);
newUser.save(function(error, user){
   //your code
}
2
dodo

Juste au cas où cela arriverait à quelqu'un d'autre.

Une autre cause de ceci pourrait être si vous n'avez pas de connexion ouverte avec votre instance de mongodb. Vérifiez votre sortie pour le retour de connexion approprié.

[initandlisten] connexion acceptée à partir de 127.0.0.1:40448 # 1 (1 connexion est maintenant ouverte)

0
Anselm