Экземпляр 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() цепочка ответственности выглядит следующим образом:

  1. Schema.pre( "сохранить")
  2. Сохранить данные в Dabe
  3. 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();

наслаждаться!