Я следую инструкциям из theodinproject прямо сейчас, и у меня возникают проблемы с аутентификацией пользователя. В руководствах они использовали Mongodb
с Mongoose
для интеграции с Passport.js
, но в моем случае я использую Postgres
с Prisma
для интеграции с Passport.js
, поэтому код будет немного другим. Я проверил и theodinproject, и документ из Passport.js
, один использует Mongoose
, а другой использует необработанный код SQL. Так что я не знаю, как это сделать с Prisma
. Я попытался провести некоторое исследование, чтобы узнать, делал ли кто-нибудь это раньше, но я не вижу для этого много результатов.
Я попытался ввести что-то, чтобы подыграть ему, и получил код ниже.
passport.use(async (username, password, done) => {
const user = await prisma.user.findFirst(
{ where: { username } },
(err, user) => {
if (err) {
return done(err);
}
if (!user) {
return done(null, false, { message: "Incorrect username" });
}
if (user.password !== password) {
return done(null, false, { message: "Incorrect password" });
}
return done(null, user);
}
);
});
Понятно, что это неправильно (потому что приложение вылетело), но я не знаю, как это исправить. Кто-нибудь может мне с этим помочь?
Заранее спасибо :)
Редактировать:
Я столкнулся с другой проблемой с deserializeUser
в соответствии с theodinproject, это их код:
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
Как я могу сделать это способом Prisma? Я пытался закодировать это сам, но я застрял здесь:
passport.deserializeUser(async (id, done) => {
const user = await prisma.user.findFirst({ where: { id } });
});
А для serializeUser
не уверен, что правильно сделал
passport.serializeUser((user, done) => {
done(null, user.id);
});
Вы пытаетесь сделать что-то подобное?
passport.use(async (username, password, done) => {
const user = await prisma.user.findFirst(
{ where: { username } },
);
if (!user) {
return done(null, false, { message: "Incorrect username" });
}
if (user.password !== password) {
return done(null, false, { message: "Incorrect password" });
}
return done(null, user);
});
findFirst
принимает только один параметр
Если вы действительно хотите поймать возможную ошибку, что-то, что не должно происходить, если ваша база данных, возможно, не работает, вы можете сделать
passport.use(async (username, password, done) => {
try {
const user = await prisma.user.findFirst(
{ where: { username } },
);
if (!user) {
return done(null, false, { message: "Incorrect username" });
}
if (user.password !== password) {
return done(null, false, { message: "Incorrect password" });
}
return done(null, user);
} catch (error) {
return done(err);
}
});
РЕДАКТИРОВАТЬ
Ваша функция serializeUser
выглядит хорошо, и для deserializeUser
нам нужно сделать то же самое, что и для функции use
.
passport.deserializeUser(async (id, done) => {
try {
// You did well where
const user = await prisma.user.findFirst({ where: { id } });
done(null, user)
} catch (error) {
done(error)
}
});
Вы были на правильном пути, хорошего дня
спасибо, что помогли мне с этим, но я столкнулся с другой проблемой
deserializeUser
(я отредактировал вопрос выше, чтобы его было легче читать). Вы случайно не знаете, как это исправить? Большое спасибо.