使用 GraphQL Mutation 更新模型

Updating model with GraphQL Mutation

我一直无法弄清楚如何使用 graphQL 更新用户。我目前的目标是让用户能够更新他们的 account/profile 信息。我为用户设置了一些东西,比如他们个人资料的简介字段,以及设置为拍摄 URL 并将其显示为他们的个人资料照片的个人资料图片字段。

我在使用 graphQL 创建时没有遇到任何问题。用户可以毫无问题地注册、登录、制作 posts 等。我还可以根据其他模型更新用户,例如,一个新的 post 推送给用户 Post 数据就好了。

不过我还没弄清楚如何直接更新用户。从本质上讲,我可以通过为“个人资料图片”创建一个新模型并将其推送给用户来解决这个问题,但这似乎只是额外的步骤,可能会减慢速度,同时也会让我自己无法学习新东西。

这是用户模型。由于确切的代码块很大,我省略了一些字段,但这包括“图像”和“生物”字段(我想更新的字段)以及对 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
    }

我注意到在资源管理器页面中,对于状态为 200 的用户,它 return 为“空”。我被引导相信这意味着它甚至无法访问用户的“图像”字段来更新它。与我关于用户的其他突变相比,它的设置非常相似,我不确定有什么区别。

我觉得我在更新方面缺少一些非常基本的东西。我一直无法找到有效的更新突变示例。有人可以帮忙吗?我的主要问题是:

  1. 为什么突变 return 对用户“无效”?

  2. 如何设置我的解析器以适当地更新 already-created object 上的信息?

感谢任何能够查看并提供帮助的人,我将密切关注此 post 的回复,并将更新任何其他可能需要帮助的代码。很长一段时间以来,我一直被更新信息所困扰,但我的网站已经接近准备就绪的地步,我需要解决这个更新问题才能取得进展。谢谢!

快速编辑:我想补充一点,“Auth”被引用了。适当的授权 headers 已到位以检索数据。只是想补充一点,因为我非常怀疑授权与此有任何关系!

我已经解决了这个问题,并想在这里留下答案给任何可能觉得它有用的人。

在 mutation 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
        }
    }

这允许用户更新他们的个人资料照片信息。希望这对您有所帮助!