Это мой код мутации, в котором я использую тип пользователя, который имеет имя, адрес электронной почты, пароль, и я делаю две мутации для регистрации пользователя и входа в систему. Я просмотрел все документы о graphql и прочитал все блоги, связанные с аутентификацией, но не могу получить ответ, чтобы вернуть токен из мутации
const mutation = new GraphQLObjectType({
name: "Mutation",
fields: {
addUser: {
type: UserType,
args: {
name: { type: GraphQLString },
email: { type: GraphQLString },
password: { type: GraphQLString },
avatar: { type: GraphQLString }
},
resolve(parentValue, args) {
const avatar = gravatar.url(args.email);
return bcrypt
.hash(args.password, 10)
.then(hash => {
args.password = hash;
const newUser = new User({
name: args.name,
email: args.email,
password: args.password,
avatar
});
return newUser
.save()
.then(user => user)
.catch(e => e);
})
.catch(e => e);
}
},
login: {
name: "Login",
type: UserType,
args: {
email: { type: GraphQLString },
password: { type: GraphQLString }
},
resolve(parentValue, args, context) {
return User.findOne({ email: args.email })
.then(user => {
if (user) {
return bcrypt
.compare(args.password, user.password)
.then(isValid => {
if (!isValid) {
throw new Error({ message: "password Incrrect" });
} else {
const token = jwt.sign(
{ name: user.name, id: user.id },
"mySecret"
);
return user;
}
})
.catch(e => e);
} else {
throw new Error({ message: "email Incorrect" });
}
})
.catch(e => e);
}
}
}
});
Это мой тип пользователя
const UserType = new GraphQLObjectType({
name: "User",
fields: {
id: { type: GraphQLString },
name: { type: GraphQLString },
email: { type: GraphQLString },
password: { type: GraphQLString },
avatar: { type: GraphQLString }
}
});





Я бы посоветовал вам обновить ваш UserType, удалив поле пароля и добавив поле токена, например:
const UserType = new GraphQLObjectType({
name: "User",
fields: {
id: { type: GraphQLString },
name: { type: GraphQLString },
email: { type: GraphQLString },
avatar: { type: GraphQLString },
token: { type: GraphQLString }
}
});
Причина в том, что UserType является возвращаемым типом мутации, поэтому он "общедоступный", и, возможно, нам не следует отправлять пароль общедоступным (поскольку мы аутентифицируемся на стороне сервера), но JWT является общедоступным, поэтому мы можем его отправить назад.
И в вашей мутации login добавьте токен в объект пользователя, например:
login: {
name: "Login",
type: UserType,
args: { email: { type: GraphQLString }, password: { type: GraphQLString } },
resolve(parentValue, args, context) {
return User.findOne({ email: args.email })
.then(user => {
.........
const token = jwt.sign(
{ name: user.name, id: user.id },
"mySecret"
);
user.token = token;
return user;
}
........
}
}