2017-06-20 6 views
-2

私の問題は、スタッフの名前や電子メールがすでにデータベースに存在するかどうかをチェックすることです。彼らは、更新前のミドルウェアでそれを行うのが良いと言います。私はそれを試みたが、それは動作していない。フィールドがデータベースに既に存在するかどうかを確認するにはどうすればよいですか?

(id_of_staff、updatedStaff_infoおよびcallback_function)を更新関数に渡します。実行される前の更新ミドルウェアと呼ばれる

module.exports.updateStaff = function(id, updatedStaff, callback){ 
var query = {_id: id}; 

    Staff.update(query, updatedStaff, callback); 

}

毎回Staff.update():

は、ここに私の更新機能です。私がここで欲しいのは、名前や電子メールがすでに存在するかどうかを確認することです。問題は、更新前のミドルウェアの名前と電子メールが未定義であることです。

マイプレ更新ミドルウェア:

staffSchema.pre("update", function(next){ 

var staff = this; 
Staff.find({_id:{$ne: staff.id}, $or:[{name: staff.name}, {email: staff.email}]}, function (err, docs) { 

    if (!docs.length){ 
     next(); 
    }else{     
     next(new Error("Name or email already exist")); 
    } 
}); 

})。

私が得た結果は、常に "名前または電子メールがすでに存在しています"です。私はstaff.nameの値をコンソールログに出力しようとしましたが、それは未定義です。私はそれを正しくしていますか?あなたはそれを働かせるために私を助けることができますか?大変ありがとうございました。

+1

あなたの質問には、より良いタイトル、問題を説明するタイトルをください。 – Li357

+0

あなたの質問のタイトルはあなたが質問している、または質問している問題を記述するべきです。あなたがMongooseを初めて使っているという事実は無関係であり、あなたが援助を受けることができるかどうかを尋ねるのは意味がありません。それがこのサイトの存在の全目的です。あなたのタイトルは、検索結果の将来の読者にとって意味のある方法で、問題を明確に記述する必要があります。 –

+0

問題のタイトルにタグ名を使用しないでください。それはタグのためのものです。ただし、パラメータとして送信するものと、実際に期待するものが一致するかどうかの詳細は不明です。最も可能性の高い原因は、指定された条件が常にデータ内の何かと一致することです。それはあなたがそうすべきではないと思うことを示すことは、あなた次第です。 [最小限で完全で検証可能なサンプルを作成する方法](https://stackoverflow.com/help/mcve) –

答えて

0

私の質問に対する解決策が見つかりました。事前更新ミドルウェアを使用するのではなく、名前または電子メールがすでに存在するかどうかを確認する関数を作成するだけです。

は、ここでは、コードです:

module.exports.updateStaff = function(id, updatedStaff, callback){ 
var query = {_id: id}; 

//check name and email if already available 
function updateStaff(id, updatedStaff, callback){ 
    //get staff that has the same name or email 
    Staff.find({_id:{$ne:id}, $or:[{name: updatedStaff.name}, {email_pc: updatedStaff.email_pc}]}).exec(
     function(err, result){ 
      console.log(result); 
      if(!err){ 
       if(result.length){         
        console.log("Name or email already exist."); 
        callback("Conflict", null); 
       } 
       else{ 
        //udpate the staff 
        Staff.update(query, updatedStaff, callback); 
       } 
      }else{ 
       callback(err); 
      } 

     }) 
} 

updateStaff(id, updatedStaff, callback); 

}

しかし、私はまだ前更新のミドルウェアを使用して答えることが開いています。ありがとう:)

+0

'result.length'は' 0'が実際に 'true'であるため正しくありません。あなたの正しい行は 'if(result.length> 0)'でなければなりません。あるいは、クエリーに '.limit(1)'を含めて、データベースが最初のものより多くの結果を返すよう不必要に要求しないようにする1つが見つかりました。 –

関連する問題