1. ホーム
  2. node.js

[解決済み] Mongoose インスタンス .save() が動作しない

2022-02-19 10:37:26

質問

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:""}
});

エンポイントの更新

作業バージョンです。 モデル.update()

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

動作しないバージョン、これを解決しなければならない。 オブジェクト.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");
})

コールバックも発火しない。接続は正常に開かれています。コールバックが起動することはありません。


  1. を使おうとした。 var User = connection.model('User', schema) は動作しませんでした。

解決方法は?

この質問は、他の人も遭遇する可能性があるので、削除するつもりはありません。実はこの問題はMongoDbやMongooseとは関係ないのです。この問題は Object.save() 責任の連鎖は以下のようになります。

<ブロッククオート
  1. Schema.pre("save")
  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();
}