2017-05-08 18 views
0

mongooseでドキュメントを更新するときに検証を実行するのが難しいです。誰かが見て、私を助けることができますか?私はasyncも使用しています。更新時にマングーススキーマの検証が実行されない

説明のため。私はmongooseのv4.9.8を使用しています。ここ

import mongoose, { Schema } from "mongoose"; 
import uniqueValidator from "mongoose-unique-validator"; 
import { isEmail } from "validator"; 

mongoose.Promise = global.Promise; 

const userSchema = new Schema({ 
    username: { 
    type: String, 
    required: true, 
    minlength: [5, "Username must be 5 characters or more"], 
    unique: true 
    }, 
    email: { 
    type: String, 
    required: true, 
    unique: true, 
    validate: { 
     validator: value => isEmail(value), 
     message: "invalid email address" 
    } 
    }, 
    password: { 
    type: String, 
    required: true, 
    minlength: [8, "Password must be 8 characters or more"] 
    } 
}, { 
    timestamps: true 
}); 
userSchema.plugin(uniqueValidator); 

const User = mongoose.model("User", userSchema); 
export default User; 

そして、私の更新エンドポイントは次のとおりです。

は、ここに私のスキーマです。

usersController.updateUser = async function(req,res){ 
    try { 
    if(req.body.password !== undefined){ 
     const hashedPassword = await bcrypt.hash(req.body.password, 10); 
     req.body.password = hashedPassword; 
    } 
    const { userID } = req.params; 
    const opts = { runValidators: true }; 
    const results = await User.update({ _id: userID }, { $set : req.body }, opts).exec(); 
    console.log(results); 
    return res.status(200).json(); 
    } catch(error){ 
    console.log(error); 
    return res.status(500).json({ error }); 
    } 
}; 

私は結果にはconsole.logを行うと私が得るすべてはこの{ n: 1, nModified: 1, ok: 1 } ませ検証がまったく実行されていないです。私を助けてください。私はこれを1時間半続けていた。

答えて

1

あなたはunique検証は、予告the following実行されていないことを意味している場合:

技術的な理由から、このプラグインはあなたにもqueryにコンテキストオプションを設定する必要があります。

ので:それは基本的にパススルー古いマングースバージョンのネイティブドライバにだとして

const opts = { runValidators: true, context : 'query' }; 
+0

これはドキュメントにはありませんでした。ありがとう! – Nate

0

マングースやミドルウェアが更新中に実行されません。詳細な回答を得るには、linkを参照してください。

その後、Mongoose 4.0では、update()およびfindOneAndUpdate()呼び出しでバリデーターを実行するオプションが導入されました。このオプションをオンにすると、update()呼び出しが$ setまたは$ unsetを試みるすべてのフィールドに対してバリデーターを実行します。

また、この問題を解決するpackageもお試しください。

関連する問題