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.
var User = connection.model('User', schema)
n'a pas fonctionné.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:
- Schema.pre ("enregistrer")
- Enregistrer les données sur dabe
- 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();
}
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!
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
}
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)