Экземпляр Mongoose.save() не работает
У меня проблема с Mongoose и MongoDb
Очень интересно, что работает только Model.update
, а save
никогда не работает и даже не запускает обратный вызов.
Мангуста: 4.4.5
MongoDB: 3.0.8
Экспресс-маршрут
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");
Модель пользователя
var user = new Schema({
uid: { type: Number, required: true, unique: true},
hwid: { type: String, default:""},
bol:{type:String,default:""}
});
Обновить Enpoint
Рабочая версия: Model.update()
User.update({_id: id}, {
uid: 5,
}, function(err, numberAffected, rawResponse) {
console.log(err);
})
Не работает версия, и я должен решить эту проблему: 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");
})
Даже обратный вызов не срабатывает. Соединение успешно открывается. Он никогда не вызывает обратный вызов.
- Пытался использовать
var User = connection.model('User', schema)
не работал.
Ответы
Ответ 1
Я не собираюсь удалять этот вопрос, потому что люди могут столкнуться с этой проблемой тоже. На самом деле проблема не была связана с MongoDb или Mongoose. Когда вы вызываете Object.save()
цепочка ответственности выглядит следующим образом:
- Schema.pre( "сохранить")
- Сохранить данные в Dabe
- Schema.post( "сохранить")
Поэтому, если вы заблокируете pre("save")
и не вызываете обработчик next()
вы не сможете сохранить свой документ. Это был мой случай, я забыл вызов next()
внутри оператора if и пытался найти ошибку более 3 часов.
user.pre("save", function(next) {
if(!this.trial){
//do your job here
next();
}
}
Когда this.trial == true
, следующий обработчик не будет доступен.
Чтобы избежать подобных ошибок, мы должны позаботиться о покрытии ветки, репортеры могут показать нам непроверенные коды. Ваша проблема может быть связана с этим тоже. Убедитесь, что вы звоните next()
если ваш документ должен быть сохранен.
Фиксированная версия
user.pre("save", function(next) {
if(!this.trial){
//do your job here
}
next();
}
Ответ 2
Как сказал Павел. Скорее всего, вы вызываете save на объект req.user, который не является объектом Mongoose. Убедитесь, что вы делаете что-то вроде этого:
//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
}
Ответ 3
Это звучит орехи.. и я пытался работать через эту проблему часами. Посмотрел на столько столбцов.. это невероятно.
И вы знаете, что это было? Я не указывал базу данных в конце URL-адреса.
Итак, вместо
"mongodb://127.0.0.1:27017/test"
У меня был
"mongodb://127.0.0.1:27017
Я потратил целый день на это. Мне очень жаль, что мне не дали какие-то ошибки. Сохранение записи всегда возвращалось нормально. И в журнале базы данных я подключался нормально. Но мне действительно нужно было посмотреть на детали. Да, он подключался к экземпляру mongo, но не к самой базе данных. тьфу!
Ответ 4
На всякий случай это случается с кем-то еще.
Другая причина может заключаться в том, что у вас нет открытого подключения к экземпляру mongodb. Проверьте выходные данные для соответствующей обратной связи.
[initandlisten] соединение принято из 127.0.0.1:40448 # 1 (теперь открыто 1 соединение)
Ответ 5
Я столкнулся с той же проблемой, оказывается, что instance.save()
возвращает обещание. Так что все, что вам нужно сделать, это выполнить обещание. Использование async/await
-
await instance.save()
Ответ 6
У меня та же проблема. Моя проблема заключалась в изменении массива внутри БД, затем, когда я пытался использовать .save(), он не понимал, что я что-то изменил, тогда .save() не работал. Я просто использую markModified() перед использованием .save() и моя проблема решается.
это мой код с проблемой: (не работает)
club.members[index].name = new_name;
club.save();
это мой решенный код: (работает)
club.members[index].name = new_name;
club.markModified('members');
club.save();
наслаждаться!