使用本地护照使用节点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);
});
}
));
答案 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不是一个函数),它可能会有所帮助
感谢您的回复。