UserWhereUniqueInput 类型的 where.email 中存在未知参数“email”。GraphQL | NodeJS

roo*_*eih 3 javascript node.js graphql

我已经测试 GraphQL 几天了,并且正在执行身份验证管理(按照本教程进行操作)。我目前因以下错误而被阻止:

Unknown arg `email` in where.email for type UserWhereUniqueInput. Did you mean `id`?
Run Code Online (Sandbox Code Playgroud)

当我提出以下请求时:

mutation {
  login(email: "contact@floriankamps.fr", password: "Test123") {
    token
    user {
      email
      links {
        url
        description
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的登录解析器:

let login = async (parent, args, context, info) => {
    const user = await context.prisma.user.findUnique({ 
        where: {
            email: args.email 
        } 
    });
    if (!user)
        throw new Error('No such user found');

    const valid = await bcrypt.compare(args.password, user.password);
    if (!valid)
        throw new Error('Invalid password');
    
    const token = jwt.sign({ userId: user.id }, APP_SECRET);

    return {
        token,
        user
    }
}
Run Code Online (Sandbox Code Playgroud)

我的 GraphQL 架构:

type Mutation {
    post(url: String!, description: String!): Link!
    updateLink(id: Int!, url: String, description: String): Link
    deleteLink(id: Int!): Link
    signup(email: String!, password: String!, name: String!): AuthPayload
    login(email: String!, password: String!): AuthPayload
}
Run Code Online (Sandbox Code Playgroud)

我真的不知道它会妨碍什么......

roo*_*eih 8

好吧,经过长时间的调查,我找到了解决方案。问题不是来自 GraphQL,而是来自 Prisma。要将电子邮件字段添加到用户模型中,我们需要将其定义为 @unique 指令,如下所示:

model User {
  id  Int @id @default(autoincrement())
  name  String
  email String @unique
  password  String
  links Link[]
}
Run Code Online (Sandbox Code Playgroud)

解决方案最初发布在这里: https: //github.com/howtographql/howtographql/issues/661#issuecomment-401372966

  • 谢谢。您还需要进行另一次 prisma 迁移:`npx prisma migrate dev --name "emailunique"` 或完全删除您的 prisma DB(从 prisma 文件夹中删除除 `schema.prisma` 之外的所有文件)(如果您创建了更多用户) 。 (2认同)