1

mongo にデータを入力する前にサーバー側の検証を行う登録作業を行っています。私はマングースを初めて使用し、すべての登録プロセスを完了するメソッドにデータを返すのに問題があります。

私の機関車コントローラーには、すべてをラップしてサインアップ プロセスを開始するメソッドがあります。

auth = new Authenticator();
auth.signUp(this.req.body);

私の認証オブジェクト signUp 内では、新しいユーザーを作成する前にデータを検証するだけです。検証の 1 つは、データベースに重複した電子メールが作成されていないことです。

this.signUpUser = function(user) {

    if(this.isNotDuplicate(user.email) {
       //continue doing whatever needs done to the data afterwards 
    } else {
        response['error'] = True
        response['response'] = "duplicate email"
    }

}

私が試している方法の 1 つは、一致するメールを探して true または false を返すことです。

this.isNotDuplicate = function(email) {

    query = user.findOne({ 'email': email });
    query.exec(function(error, user) {

        if(error) {
            console.log(error);
        }

        console.log(user);
        return (user === null) ? false : true;

     });
}

そこにあるデータベースに電子メールを渡すと、console.log() を使用するとユーザーが表示されますが、機関車が応答オブジェクトを返す場合を除き、何も返すことができません。しかし、データの処理を継続できる必要があります。私はこれを完全に間違っている可能性があることを認識しているので、私の設計が悪い場合は、node.js、express、および機関車で動作するように変更する方法について説明が必要です。

クエリに関する mongoose のドキュメント ( http://mongoosejs.com/docs/queries.html ) を読みました。彼らの例では console.log() を使用していますが、確かに、マングース クエリだけでなく、他の場所でマングースから取得したデータを使用する方法があります。私の設計がこの方法でうまくいかない場合、どのように変更することをお勧めしますか? または、mongoose クエリからのデータまたは使用する別の値を返すにはどうすればよいでしょうか?

4

1 に答える 1

4

this.isNotDuplicate非同期にする必要があります。次のようなことを試してください:

this.isNotDuplicate = function(email, callback) {
  var query = user.findOne({ 'email': email })
  query.exec(function(err, user) {
    if (err) {
      console.log(err)
      callback(err)
    } else {
      console.log(user)
      cb(null, !!user)
  })
}

そして、ユーザーをチェックするとき:

this.signUpUser = function(user) {
  this.isNotDuplicate(user.email, function(err, exists) {
    if (err || exists) {
      response['error'] = true
      response['message'] = (exists) ? 'duplicate email' : 'error'
    } else {
      // continue doing whatever needs to be done
    }
  })
}
于 2013-11-10T06:28:17.750 に答える