У меня возникли проблемы с выяснением того, как обновить пользователя с помощью graphQL. Функциональность, к которой я сейчас стремлюсь, заключается в том, чтобы пользователь мог обновлять информацию о своей учетной записи/профиле. У меня есть некоторые настройки для пользователя, такие как поле биографии для его профиля и поле изображения профиля, которое настроено на получение URL-адреса и отображение его в качестве изображения их профиля.
У меня нет проблем, когда дело доходит до создания с помощью graphQL. Пользователь может зарегистрироваться, войти в систему, публиковать сообщения и т. д. без проблем. Я также могу обновить пользователя в отношении других моделей, например, новый пост отлично отправляет данные поста пользователям.
Однако я не смог понять, как обновить пользователя напрямую. По сути, я могу обойти это, создав новую модель для «фото профиля» и отправив ее пользователю, но похоже, что это просто дополнительные шаги, которые могут замедлить работу, а также лишить себя возможности узнать что-то новое.
Это модель пользователя. Я пропустил несколько полей из-за того, что точный блок кода большой, но это включает в себя поля «изображение» и «био» (поля, которые я хотел бы обновить), а также ссылку на модель Post, о которой я упоминал выше. который функционирует надлежащим образом.
User.js
const userSchema = new Schema(
{
username: {
type: String,
required: true,
unique: true,
trim: true
},
email: {
type: String,
required: true,
unique: true,
match: [/.+@.+\..+/, 'Must match an email address!']
},
password: {
type: String,
required: true,
minlength: 8
},
image: {
type: String
},
bio: {
type: String,
maxLength: 500
},
posts: [
{
type: Schema.Types.ObjectId,
ref: 'Post'
}
],
},
Ниже представлена мутация в Проводнике, включая переменные и результат.
Преобразователь изображения профиля
addProfilePic: async (parent, { image }, context) => {
if (context.user) {
const updatedUser = await User.findOneAndUpdate(
{ _id: context.user._id },
{ image: image },
{ new: true, runValidators: true }
);
return updatedUser;
}
throw new AuthenticationError('You need to be logged in!');
},
typeDefs.js (только актуально)
type Mutation {
addProfilePic(_id: ID!, image: String!): Auth
}
Я заметил, что на странице Explorer он возвращает «null» для пользователя со статусом 200. Меня заставили поверить, что это означает, что он не может даже получить доступ к полю «изображение» у пользователя, чтобы иметь возможность его обновить. По сравнению с другими моими мутациями в отношении пользователей, это настроено очень похоже, и я не уверен, в чем разница.
Я чувствую, что мне не хватает чего-то очень простого в отношении возможности обновления. Мне не удалось найти работающий пример мутации обновления. Может ли кто-нибудь помочь? Мои основные вопросы будут такими:
Почему мутация возвращает «ноль» для пользователя?
Как настроить преобразователь для надлежащего обновления информации об уже созданном объекте?
Спасибо всем, кто может взглянуть и помочь, я буду внимательно следить за ответами на этот пост и буду обновлять любой другой код, который может понадобиться кому-то, чтобы помочь. Я долго не мог обновить информацию, но мой сайт приближается к тому моменту, когда он почти готов, и мне нужно решить эту проблему с обновлением, чтобы двигаться дальше. Благодарю вас!
Быстрое редактирование: я хочу добавить, что упоминается «Аутентификация». Имеются соответствующие заголовки авторизации для извлечения данных. Просто хотел добавить, что, поскольку я очень сомневаюсь, что авторизация имеет к этому какое-то отношение!
Я решил эту проблему и хотел бы оставить ответ здесь для всех, кто может найти его полезным.
В мутации typeDefs я изменил "Auth" на "User",
type Mutation {
addProfilePic(_id: ID!, image: String!): User
}
а затем в самой мутации убрали пользовательское поле вот так:
mutation addProfilePic($_id: ID!, $image: String!) {
addProfilePic(_id: $_id, image: $image) {
_id
username
image
}
}
Это позволило пользователю обновить информацию о фотографии своего профиля. Надеюсь это поможет!