2

ノードjsとmongooseを使用してローカルパスポートを使用してパスポート戦略を使用する際に問題があります。ときには(必ずしもそうではない)、次のようなエラーが表示され、わからなかったため、システムにログインできませんでした。私はクライアント側のために角度JSを使用しました。ここでMongoose schematype.castForQueryエラー。ユーザー認証に失敗しました

TypeError: schematype.castForQuery is not a function 
at cast (/Users/Harry/Desktop/socketio/node_modules/mongoose/lib/cast.js:229:32) 
at Query.cast (/Users/Harry/Desktop/socketio/node_modules/mongoose/lib/query.js:2753:12) 
at Query.findOne (/Users/Harry/Desktop/socketio/node_modules/mongoose/lib/query.js:1353:10) 
at Function.findOne (/Users/Harry/Desktop/socketio/node_modules/mongoose/lib/model.js:1343:13) 
at Strategy._verify (/Users/Harry/Desktop/socketio/app_api/config/passport.js:17:8) 
at Strategy.authenticate (/Users/Harry/Desktop/socketio/node_modules/passport-local/lib/strategy.js:90:12) 
at attempt (/Users/Harry/Desktop/socketio/node_modules/passport/lib/middleware/authenticate.js:348:16) 
at authenticate (/Users/Harry/Desktop/socketio/node_modules/passport/lib/middleware/authenticate.js:349:7) 
at module.exports.login (/Users/Harry/Desktop/socketio/app_api/controllers/authentication.js:302:4) 
at Layer.handle [as handle_request] (/Users/Harry/Desktop/socketio/node_modules/express/lib/router/layer.js:95:5) 
at next (/Users/Harry/Desktop/socketio/node_modules/express/lib/router/route.js:131:13) 
at Route.dispatch (/Users/Harry/Desktop/socketio/node_modules/express/lib/router/route.js:112:3) 
at Layer.handle [as handle_request] (/Users/Harry/Desktop/socketio/node_modules/express/lib/router/layer.js:95:5) 
at /Users/Harry/Desktop/socketio/node_modules/express/lib/router/index.js:277:22 
at Function.process_params (/Users/Harry/Desktop/socketio/node_modules/express/lib/router/index.js:330:12) 
at next (/Users/Harry/Desktop/socketio/node_modules/express/lib/router/index.js:271:10) 

は、エラーのポインティングのために私のコードです: .Iはエラーを見つけることができませんでした(常にではない)私は、ログインしようとしたが、それは時々、上記のエラーを言います。ここで

module.exports.login = function(req, res) { 
if (!req.body.email || !req.body.password) { 
    sendJSONresponse(res, 400, { 
     "message": "All fields Required." 
    }); 
    return; 
} 

passport.authenticate('local', function(err, user, info) { 
    var token; 
    if (err) { 

     sendJSONresponse(res, 400, err); 
     return; 
    } 
    // console.log('user detail : '+user); 
    if (user && user.verified === true) { 
     token = user.generateJwt(); 
     sendJSONresponse(res, 200, { 
      "token": token 
     }); 

    } else { 
     sendJSONresponse(res, 401, info); 

    } 

})(req, res); // make sure that req, res are available to the passport 

}; 

はパスポートの戦略のためのコードです:

passport.use(new LocalStrategy({ 
    usernameField: 'email' 
}, 
function(username, password, done) { 
    User.findOne({ 
     email: username 
    }, function(err, user) { 
     if (err) { 
      console.log("passport_error : "+err); 
      return done(err); 
     } 
     if (!user) { 
      return done(null, false, { 
       "message": "Incorrect Username." 
      }); 
     } 
     if (!user.validPassword(password)) { 
      return done(null, false, { 
       "message": "Incorrect Password." + password 
      }); 
     } 
     console.log(user); 
     return done(null, user); 

    }); 
} 
)); 
+0

次のログ行を追加してください。出力が '{} 'でなければ、それはあなたの問題です。 'console.log(" Object.prototype: "、Object.prototype);' – joeytwiddle

+0

@joeytwiddleうん、私はそれをやった。最初は{}を得ました。そして私は正常にログインすることができました。しかし、私が誰かとチャットを始めてシステムからログアウトすると、ログインできませんでした。私の電子メールは、自分のパスポート内の機能(ファンクション(ユーザー名、パスワード、完了){)内に届きました。ここでは、ユーザー名は何でも電子メールで出力されますが、これは無視されず、データベースからチェックされません。そして今度は、{}の代わりに(Object.prototype:{getKey:[Function]})を取得しました。あなたは何か事実かもしれない、把握できますか?ありがとう –

答えて

1

私は私の質問への解決策を見つけました。今それは動作します。 Object.prototypeを使用して次のコードを使用しました。

Object.prototype.getKey = function(value) { 
     for (var key in this) { 
      if (this[key] == value) { 
       return key; 
      } 
     } 
     return null; 
    }; 
    var key = usernames.getKey(toUser); 

特定の値のキー(私の場合はtoUser)を正常に返しました。しかし、私はそれが働いていなかったし、バックでログインしていなかった、システムからログアウト。 毎回は今、私は全体のメソッドを削除し、コードを次のように置き換え...

の鍵を返すために簡単な方法である
function findKey(user) { 
     for (var key in usernames) { 
      if (usernames[key] == user) return key; 
     } 
     return false; 
    } 
    var key= findKey(toUser); 

JSONオブジェクトのcetrain値。そして今、私のmongodb findOneメソッドに問題はありません。 Object.prototypeメソッドを使用してキーを返すことで、エラーの背後にある理由が分かりませんでした。しかし、奇妙なエラーは少し変化しています。

君たちは(Schematype.castForQueryは関数ではありません)同じエラータイプで立ち往生している場合SO、それが役に立つ

かもしれませんがご回答いただきありがとうございます。

関連する問題