#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,
}
},