Я пытаюсь использовать passport.js с sqlite, но проблема в том, что я не могу сериализовать пользователя, потому что идентификатор не существует
Чтобы сохранить пользователя, я делаю это:
export const saveUser = async (req: Request, res: Response, next: NextFunction) => {
const users = new UserRepository(db, 'users');
const hash = bcrypt.hash(req.body.password, 10);
const user = new User(
req.body.gender,
req.body.first_name,
req.body.last_name,
req.body.email.toLowerCase(),
await hash,
req.body.dob,
req.body.zip_code,
req.body.house_number,
req.body.addition || null,
);
const emailExists = users.findOne({ email: req.body.email.toLowerCase() });
if (emailExists) {
return res.redirect('/users/register');
} else {
users.create(user);
req.logIn(user, (err) => {
if (err) return next(err);
res.redirect('/');
});
}
};
Запрос выглядит так:
public create(item: T): boolean {
const query = `
INSERT INTO ${this.table} (${Object.keys(item).join(',')})
VALUES (${Object.keys(item).map((_) => '?').join(',')})`;
const stmt = this.db.prepare(query);
const result = stmt.run(Object.values(item));
return !!result.changes;
}
Это моя конфигурация паспорта:
passport.serializeUser((user: any, done) => {
console.log(user);
done(undefined, user.id);
});
passport.deserializeUser((id: number, done) => {
const user = users.findById(id);
if (!user) return done(undefined, false);
return done(undefined, user);
});
passport.use(new Strategy({ passReqToCallback: true }, (_, email, password, done) => {
const user = users.findOne({ email: email.toLowerCase() });
if (!user) return done(undefined, false);
bcrypt.compare(password, user.password, (err, isValid) => {
if (err) return done(err);
if (!isValid) return done(undefined, false);
return done(undefined, user);
});
}));
Я не могу сериализовать пользователя, потому что в объекте не возвращен идентификатор, может кто-нибудьпомогите мне заставить работать паспортную аутентификацию?