2017-01-11 5 views
0

私はコード内のログインルートを除くすべてのルートでchecktokenというミドルウェアを使用しました。ログインURLを押すと、トークンがチェックされている場所にログインします。しかし、私はログイン後に任意のルートに行きたい場合は、checkToken middleware.iの中に私を制限するトークンを生成し、それを確認するためにjsonwebtokenモジュールを使用しました。しかし、私のコードはusers.hereを見つけることができませんでした私のチェックトークンミドルウェアコードCastError:ObjectIdへのキャストがmongoose操作で値に失敗しました

if (token) { 
    try { 
     var decoded = jsonwebtoken.verify(token, jwt_key); 
     req.user = decoded.user;/// 
     console.log(req.user._id);// i get id here and from this id i can find user in database 
     UserSchema.findOne({ 
       _id: req.user._id 
      })///this query failed finding result 
      .exec(function(err, result) { 
       if (err) { 
        console.log(err);//error gets output in the console. 
        res.status(500); 
        return res.json({ 
         result: err 
        }); 
       } 
       if (result) { 
        return next(); 
       } else { 
        res.status(400); 
        return res.json({ 
         message: "The user does not exists" 
        }); 
       } 
      }); 

    } catch (err) { 
     res.status(403); 
     res.json({ 
      message: "Invalid Token" 
     }); 
    } 
} else { 
    res.status(401); 
    res.json({ 
     message: "No token provided" 
    }); 
} 

私はコンソールで取得エラーメッセージは、私が間違っているところ、私は理解することはできません

{ [CastError: Cast to ObjectId failed for value "5875d76e1df97635623061c5" at path "_id" for model "User"] 
    message: 'Cast to ObjectId failed for value "5875d76e1df97635623061c5" at path "_id" for model "User"', 
    name: 'CastError', 
    stringValue: '"5875d76e1df97635623061c5"', 
    kind: 'ObjectId', 
    value: '5875d76e1df97635623061c5', 
    path: '_id', 
    reason: undefined, 
    model: 
    { [Function: model] 
    hooks: Kareem { _pres: {}, _posts: {} }, 
    base: 
     Mongoose { 
     connections: [Object], 
     plugins: [], 
     models: [Object], 
     modelSchemas: [Object], 
     options: [Object] }, 
    modelName: 'User', 
    model: [Function: model], 
    db: 
     NativeConnection { 
     base: [Object], 
     collections: [Object], 
     models: [Object], 
     config: [Object], 
     replica: false, 
     hosts: null, 
     host: 'localhost', 
     port: 27017, 
     user: undefined, 
     pass: undefined, 
     name: 'myschoolbus_demo', 
     options: [Object], 
     otherDbs: [], 
     _readyState: 1, 
     _closeCalled: false, 
     _hasOpened: true, 
     _listening: false, 
     db: [Object] }, 
    discriminators: undefined, 
    schema: 
     Schema { 
     obj: [Object], 
     paths: [Object], 
     subpaths: {}, 
     virtuals: [Object], 
     singleNestedPaths: {}, 
     nested: [Object], 
     inherits: {}, 
     callQueue: [Object], 
     _indexes: [], 
     methods: [Object], 
     statics: {}, 
     tree: [Object], 
     _requiredpaths: undefined, 
     discriminatorMapping: undefined, 
     _indexedpaths: undefined, 
     query: {}, 
     childSchemas: [], 
     s: [Object], 
     options: [Object], 
     '$globalPluginsApplied': true }, 
    collection: 
     NativeCollection { 
     collection: [Object], 
     opts: [Object], 
     name: 'users', 
     collectionName: 'users', 
     conn: [Object], 
     queue: [], 
     buffer: false, 
     emitter: [Object] }, 
    Query: { [Function] base: [Object] }, 
    '$__insertMany': [Function], 
    insertMany: [Function] } } 

です。どんな提案も高く評価されます。

+0

あなたはreq.user._idのタイプをチェックしてからオブジェクトに変換しようとします。 –

+0

あなたはUserSchemaを使用していますか?モデルではない? – Zlatko

答えて

0

あなたのIDから引用符を削除してください。あなたのエラー:

stringValue: '"5875d76e1df97635623061c5"', 

開始時と終了時に"を参照してください。それは文字列の一部です。あなたのミドルウェア、またはフロントエンドか誰かがそれを置くかどうかは分かりませんので、あなた自身でそれを剥がすか、前に渡してください。

Try this: 

UserSchema.findOne({ 
    _id: req.user._id.replace(/"/g, '') 
}) 
+0

でも同じエラーが表示されています:( – jsgeek

+0

全く同じですか?あなたは引用符で囲まれていませんでしたか? 'console.log( '" 5875d76e1df97635623061c5 "' === '" 5875d76e1df97635623061c5 "/"/ g、 ''))'? – Zlatko

+0

5875d76e1df97635623061c5が私のコンソールに「5875d76e1df97635623061c5」とはっきりしない – jsgeek

関連する問題