Распознаватель запросов внутри функции ожидания мутации опущен

#javascript #graphql #prisma

#javascript #graphql #prisma

Вопрос:

У меня возникли небольшие проблемы при запросе внутри мутации, я полагаю, возможно, я неправильно вызываю запрос, потому что он выполняется, но не ожидает ответа, поэтому я получаю неопределенное значение, пожалуйста, поправьте меня.

Пожалуйста, обратите внимание, что я использую привязку prisma

Это мои распознаватели мутаций:

 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;
  

В функции входа в систему при запросе пользователя или пользователей я пробую оба запроса, даже зная, что у меня есть электронная почта в качестве уникального поля, он всегда печатает, что такой пользователь не найден, потому что я получаю undefined, IDK, если это связано с привязкой prisma или неправильным выполнением вызова функции prisma.

Вот моя схема.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 мне не нужно определять запрос users(), привязка справится с этим правильно?? Даже если бы это было так, у меня была бы другая ошибка, которая не соответствует действительности.

Возможно, я упускаю какую-то маленькую деталь, буду благодарен, если кто-нибудь укажет мне правильное направление.

Заранее спасибо…

Комментарии:

1. Является ли электронная почта частью «данных» в пользовательском запросе? Если это так, вам нужно 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,
    }
  },