省略突变等待函数中的查询解析器

Posted

技术标签:

【中文标题】省略突变等待函数中的查询解析器【英文标题】:Query resolver inside Mutation await function omitted 【发布时间】:2019-08-28 02:52:33 【问题描述】:

我在突变内部查询时遇到了一点麻烦,我相信我可能没有正确调用查询,因为它执行但没有等待响应,所以我得到一个未定义的值,请纠正我。

请注意,我使用的是棱镜绑定

这是我的变异解析器:

const Mutation = 

  async signUp(parent, args, ctx, info) 
    const password = await bcrypt.hash(args.password, 10)
    const user = await ctx.db.mutation.createUser( data: ...args, password )
    const token = jwt.sign( userId: user.id , process.env.PRISMA_SECRET)

    return 
      token,
      user,
    
  ,

  async login(parent, args, ctx, info) 
    const user = await ctx.db.query.users( where:email: args.email, info)

    if (!user) 
      throw new Error('No such user found')
    

    const valid = bcrypt.compare(args.password, user.password)
    if (!valid) 
      throw new Error('Invalid password')
    

    const token = jwt.sign( userId: user.id , process.env.PRISMA_SECRET)

    return 
      token,
      user,
    
  ,


;

module.exports = Mutation;

在登录功能中查询 一个或多个用户时,即使知道我有电子邮件作为唯一字段,我也会尝试这两个查询它总是打印 No such user found due I receive undefined, IDK 如果是因为 prisma-绑定或未正确执行对 prisma 的函数调用。

这是我的 schema.graphql

type Query 
  // some queries 


type Mutation 
  signUp(
    name: String!
    email: String!
    password: String!
  ): AuthPayLoad

  login(
    email: String!
    password: String!
  ): AuthPayLoad



type AuthPayLoad 
  token: String
  user: User

所以对于 prisma-binding 我不必定义查询 users(),绑定会处理它吗?即使是这样,我也会有另一个错误,但事实并非如此。

也许我遗漏了一些小细节,如果有人指出我正确的方向,我将不胜感激。

提前谢谢...

【问题讨论】:

电子邮件是用户查询中“数据”的一部分吗?如果是这样,您需要const user = await ctx.db.query.user( where:email: args.data.email) 【参考方案1】:

您将错误的选择集传递给查询。您在登录突变中返回 AuthPayload,但您将其传递给用户查询,这肯定是不兼容的。

试试这个

  async login(parent, args, ctx, info) 
    const user = await ctx.db.query.user( where:email: args.email,` id name email `) // pass in the other fields you want in this selection set

    if (!user) 
      throw new Error('No such user found')
    

    const valid = bcrypt.compare(args.password, user.password)
    if (!valid) 
      throw new Error('Invalid password')
    

    const token = jwt.sign( userId: user.id , process.env.PRISMA_SECRET)

    return 
      token,
      user,
    
  ,

【讨论】:

以上是关于省略突变等待函数中的查询解析器的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 GraphQL 中的嵌套输入

Apollo GraphQL:未在突变子字段上调用解析器

如何在 GraphQL 突变/解析器中为每个用户创建和停止唯一的计时器

Apollo-server 2 验证中间件

使用来自突变解析器的 GraphQL Yoga 响应自定义 HTTP 代码

Prisma:在突变解析器中使用计数