【问题标题】:Mongoose schematype.castForQuery error. User authentication failedMongoose schematype.castForQuery 错误。用户身份验证失败
【发布时间】:2023-04-04 02:51:01
【问题描述】:

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

    });
}
));

【问题讨论】:

  • 请添加以下日志记录行。如果输出不是{},那就是你的问题。 console.log("Object.prototype:", Object.prototype);
  • @joeytwiddle 是的,我做到了。起初我得到了 {}。我可以成功登录。但是当我开始与某人聊天并从系统中注销时,我无法登录。我给定的电子邮件到达了我护照中的函数内部(函数(用户名,密码,完成){)。在这里,无论我给什么电子邮件,都会打印用户名,但它不会超出此范围并从数据库中检查。而这次我得到了 (Object.prototype: { getKey: [Function] } ) 而不是 {} 。你能弄清楚,可能是什么情况?谢谢

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


【解决方案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 不是函数),它可能会有所帮助

感谢您的回复。

【讨论】:

    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 2019-12-12
    相关资源
    最近更新 更多