Mongoose schematype.castForQuery错误。用户身份验证失败

时间:2017-02-20 21:35:17

标签: node.js express mongoose passport-local passport-facebook

使用本地护照使用节点js和mongoose时使用护照策略时遇到问题。有时(并非总是)它显示以下错误,我无法弄清楚,我无法登录到系统。我在客户端使用了角度JS。

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)

这是我的错误指向的代码: 我试图登录,但它有时(并不总是)说上述错误。我找不到错误。

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);

    });
}
));

1 个答案:

答案 0 :(得分: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不是一个函数),它可能会有所帮助

感谢您的回复。