passport.js 使用 mysql 连接反序列化用户
passport.js deserialize user with mysql connection
当我将 passport.js 中的用户连接到数据库时,如何反序列化它?当我使用数组时它可以工作,但是一旦它连接到数据库它就停止工作了。
我该如何解决?
Error: Failed to deserialize user out of session
at pass (/Users/frederik/IdeaProjects/vr/node_modules/passport/lib/authenticator.js:341:19)
at deserialized (/Users/frederik/IdeaProjects/vr/node_modules/passport/lib/authenticator.js:346:7)
at /Users/frederik/IdeaProjects/vr/src/login/passport-config.ts:42:54
at pass (/Users/frederik/IdeaProjects/vr/node_modules/passport/lib/authenticator.js:354:9)
at Authenticator.deserializeUser (/Users/frederik/IdeaProjects/vr/node_modules/passport/lib/authenticator.js:359:5)
at SessionStrategy.authenticate (/Users/frederik/IdeaProjects/vr/node_modules/passport/lib/strategies/session.js:61:10)
at attempt (/Users/frederik/IdeaProjects/vr/node_modules/passport/lib/middleware/authenticate.js:369:16)
at authenticate (/Users/frederik/IdeaProjects/vr/node_modules/passport/lib/middleware/authenticate.js:370:7)
at Layer.handle [as handle_request] (/Users/frederik/IdeaProjects/vr/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/Users/frederik/IdeaProjects/vr/node_modules/express/lib/router/index.js:323:13)
const authenticateUserDB = (email: string, password: string, done: any) => {
sql._getInstance()._getConnection().query('SELECT * FROM `users` WHERE ?',{email:email}, function (error:MysqlError|null, results:any) {
if (error) return done(error, false, "No database connection");
if(results.length == 0) return done(null, false, "No User with that email");
//TODO:encrypt
if(password == results[0].password){
return done(null, {
id: results[0]['uuid'],
name: results[0]['name'],
email: results[0]['email'],
password: results[0]['password']
});
}else{
return done(null, false, "Password is incorect");
}
});
}
const getUserByUUID = (uuid:string)=>{
sql._getInstance()._getConnection().query('SELECT * FROM `users` WHERE ?',{uuid:uuid}, function (error:MysqlError|null, results:any) {
if (error) throw Error();
if(results.length == 0) throw Error();
return {
id: results[0]['uuid'],
name: results[0]['name'],
email: results[0]['email'],
}
});
}
passport.use(new Strategy({usernameField: 'email'}, authenticateUserDB));
passport.serializeUser((user: any, done: any) => done(null, user.id));
passport.deserializeUser((id: any, done: any) => done(null, getUserByUUID(id)));
问题是反序列化没有等待 getUserByUUid
const getUserByUUID = (uuid: string) => {
return new Promise((resolve, reject) => {
sql._getInstance()._getConnection().query('SELECT * FROM `users` WHERE ?', {uuid: uuid}, function (error: MysqlError | null, results: any) {
if (error) reject("");
if (results.length == 0) reject("");
resolve({
id: results[0]['uuid'],
name: results[0]['name'],
email: results[0]['email'],
password: results[0]['password']
});
});
})
}
passport.deserializeUser(async (id: any, done: any) => done(null, await getUserByUUID(id)));
当我将 passport.js 中的用户连接到数据库时,如何反序列化它?当我使用数组时它可以工作,但是一旦它连接到数据库它就停止工作了。 我该如何解决?
Error: Failed to deserialize user out of session
at pass (/Users/frederik/IdeaProjects/vr/node_modules/passport/lib/authenticator.js:341:19)
at deserialized (/Users/frederik/IdeaProjects/vr/node_modules/passport/lib/authenticator.js:346:7)
at /Users/frederik/IdeaProjects/vr/src/login/passport-config.ts:42:54
at pass (/Users/frederik/IdeaProjects/vr/node_modules/passport/lib/authenticator.js:354:9)
at Authenticator.deserializeUser (/Users/frederik/IdeaProjects/vr/node_modules/passport/lib/authenticator.js:359:5)
at SessionStrategy.authenticate (/Users/frederik/IdeaProjects/vr/node_modules/passport/lib/strategies/session.js:61:10)
at attempt (/Users/frederik/IdeaProjects/vr/node_modules/passport/lib/middleware/authenticate.js:369:16)
at authenticate (/Users/frederik/IdeaProjects/vr/node_modules/passport/lib/middleware/authenticate.js:370:7)
at Layer.handle [as handle_request] (/Users/frederik/IdeaProjects/vr/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/Users/frederik/IdeaProjects/vr/node_modules/express/lib/router/index.js:323:13)
const authenticateUserDB = (email: string, password: string, done: any) => {
sql._getInstance()._getConnection().query('SELECT * FROM `users` WHERE ?',{email:email}, function (error:MysqlError|null, results:any) {
if (error) return done(error, false, "No database connection");
if(results.length == 0) return done(null, false, "No User with that email");
//TODO:encrypt
if(password == results[0].password){
return done(null, {
id: results[0]['uuid'],
name: results[0]['name'],
email: results[0]['email'],
password: results[0]['password']
});
}else{
return done(null, false, "Password is incorect");
}
});
}
const getUserByUUID = (uuid:string)=>{
sql._getInstance()._getConnection().query('SELECT * FROM `users` WHERE ?',{uuid:uuid}, function (error:MysqlError|null, results:any) {
if (error) throw Error();
if(results.length == 0) throw Error();
return {
id: results[0]['uuid'],
name: results[0]['name'],
email: results[0]['email'],
}
});
}
passport.use(new Strategy({usernameField: 'email'}, authenticateUserDB));
passport.serializeUser((user: any, done: any) => done(null, user.id));
passport.deserializeUser((id: any, done: any) => done(null, getUserByUUID(id)));
问题是反序列化没有等待 getUserByUUid
const getUserByUUID = (uuid: string) => {
return new Promise((resolve, reject) => {
sql._getInstance()._getConnection().query('SELECT * FROM `users` WHERE ?', {uuid: uuid}, function (error: MysqlError | null, results: any) {
if (error) reject("");
if (results.length == 0) reject("");
resolve({
id: results[0]['uuid'],
name: results[0]['name'],
email: results[0]['email'],
password: results[0]['password']
});
});
})
}
passport.deserializeUser(async (id: any, done: any) => done(null, await getUserByUUID(id)));