【发布时间】:2019-01-23 16:37:56
【问题描述】:
我正在尝试为 Web 应用程序构建后端,但我被卡在了护照上。现在我可以注册一个用户并登录该用户,但我不能连续登录两次。每当调用反序列化用户时,我都会收到“TypeError:无法读取未定义的属性'findOne'”我看到该用户未定义,但是当我在 login() 和 signup() 上调用它时它已定义
var login = require('./login');
var signup = require('./signup');
module.exports = function (passport: any, user: any) {
// Passport needs to be able to serialize and deserialize users to support persistent login sessions
passport.serializeUser(function (user: any, done: any) {
done(undefined, user.username);
});
// deserialize user
passport.deserializeUser(function (id: any, done: any) {
user.findOne(id).then(function (user: any) {
if (user) {
done(null, user.get());
} else {
done("error", undefined);
}
});
});
// Setting up Passport Strategies for Login and SignUp/Registration
login(passport, user);
signup(passport, user);
}
在我的 app.ts 文件中,我实现了这样的策略:
var models = require("./config/models/User");
require('./config/passport/init')(passport, models.user);
signup.js
var LocalStrategy = require('passport-local').Strategy;
var bCrypt = require('bcrypt-nodejs');
module.exports = function(passport : any, user : any) {
var User = user
passport.use('signup', new LocalStrategy(
{
usernameField: 'username',
passwordField: 'password',
passReqToCallback: true // allows us to pass back the entire request to the callback
}, function(req: Request, username: string, password: string, done: any) {
var User = user
console.log("signup"+User)
var generateHash = function(password: string) {
return bCrypt.hashSync(password, bCrypt.genSaltSync(8), null);
};
User.findOne({
where: {
username: username
}
}).then(function(user: any) {
if (user)
{
console.log('already taken')
return done(null, false, {
message: 'That email is already taken'
});
} else {
var userPassword = generateHash(password);
var data =
{
username: username,
password: userPassword,
firstname: req.body.firstname,
lastname: req.body.lastname
};
User.create(data).then(function(newUser: any, created: boolean) {
if (!newUser) {
return done(null, false);
}
if (newUser) {
return done(null, newUser);
}
});
}
});
}
));
}
login.js
import { passport } from '../../app'
var LocalStrategy = require('passport-local').Strategy;
var bCrypt = require('bcrypt-nodejs');
module.exports = function(passport : any, user : any) {
//LOCAL SIGNIN
passport.use('login', new LocalStrategy(
{
// by default, local strategy uses username and password, we will override with email
usernameField: 'username',
passwordField: 'password',
passReqToCallback: true // allows us to pass back the entire request to the callback
},
function(req : Request, username : string, password : string, done : any) {
var User = user;
console.log("login: "+User)
var isValidPassword = function(userpass : string, password : string) {
return bCrypt.compareSync(password, userpass);
}
User.findOne({
where: {
username: username
}
}).then(function(user : any) {
if (!user) {
return done(null, false, {
message: 'User does not exist'
});
}
if (!isValidPassword(user.password, password)) {
return done(null, false, {
message: 'Incorrect password.'
});
}
var userinfo = user.get();
return done(null, userinfo);
}).catch(function(err : Error) {
console.log("Error:", err);
return done(null, false, {
message: 'Something went wrong with your Signin'
});
});
}
));
}
【问题讨论】:
-
能把
login和signup的代码也发一下吗? -
您正在使用
username序列化用户并尝试使用id反序列化。在两个函数中都应该是id或username -
已添加登录和注册,
-
如何让用户名通过?我以为它把用户名保存在 cookie 中的 id 下?
标签: node.js typescript sequelize.js passport.js passport-local