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

Mongoose schematype.castForQuery error. User authentication failed

我在使用节点 js 和 mongoose 使用本地护照的护照策略时遇到问题。有时(并非总是)它显示以下错误,我无法弄清楚,我无法登录系统。我在客户端使用了 angular 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);

    });
}
));

我找到了问题的解决方案。现在可以了。我使用 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);

它成功地return输入了特定值的键(在我的例子中是toUser)。但是,每次我注销系统时,它都无法正常工作并且无法重新登录。 现在我删除了整个方法并替换为以下代码...

    function findKey(user) {
        for (var key in usernames) {
            if (usernames[key] == user) return key;
        }
        return false;
    }
    var key= findKey(toUser);

这是 JSON 对象中 cetrain 值的 return 键的更简单方法。现在,我的 mongodb findOne 方法没有问题。通过对 return 键使用 Object.prototype 方法仍然无法找出错误背后的原因。然而,奇怪的错误随着小的变化就消失了。

所以,如果你们遇到相同的错误类型(Schematype.castForQuery 不是一个函数),它可能会有所帮助

感谢您的回复。