首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Prisma中使用Passport.js

如何在Prisma中使用Passport.js
EN

Stack Overflow用户
提问于 2022-11-23 15:25:43
回答 1查看 20关注 0票数 0

我现在正在学习theodinproject的教程,并且在用户身份验证方面遇到了问题。在教程中,他们使用MongodbMongoose来与Passport.js集成,但在我的例子中,我使用PostgresPrismaPassport.js集成,所以代码会有所不同。我从Passport.js中检查了theodinproject和doc,一个使用Mongoose,另一个使用原始SQL代码。所以我不知道如何使用Prisma。我试图做一些研究,看看是否有人曾经这样做过,但我没有看到多少结果。

我试着键入一些东西与它一起玩,并给出了下面的代码

代码语言:javascript
运行
复制
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,这是他们的代码:

代码语言:javascript
运行
复制
passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

我怎么才能用Prisma的方式做这件事?我试着自己编码,但我被困在这里:

代码语言:javascript
运行
复制
passport.deserializeUser(async (id, done) => {
  const user = await prisma.user.findFirst({ where: { id } });
});

对于serializeUser,我不确定我做得对不对

代码语言:javascript
运行
复制
passport.serializeUser((user, done) => {
  done(null, user.id);
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-23 16:05:42

你想做这样的事吗?

代码语言:javascript
运行
复制
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只接受一个参数

如果你真的想捕捉一个可能的错误,除非你的数据库关闭,否则不应该发生的事情,你可以做。

代码语言:javascript
运行
复制
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函数相同的操作

代码语言:javascript
运行
复制
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)
  }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74549251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档