使用 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 为“空”。我被引导相信这意味着它甚至无法访问用户的“图像”字段来更新它。与我关于用户的其他突变相比,它的设置非常相似,我不确定有什么区别。
我觉得我在更新方面缺少一些非常基本的东西。我一直无法找到有效的更新突变示例。有人可以帮忙吗?我的主要问题是:
为什么突变 return 对用户“无效”?
如何设置我的解析器以适当地更新 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
}
}
这允许用户更新他们的个人资料照片信息。希望这对您有所帮助!
我一直无法弄清楚如何使用 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 为“空”。我被引导相信这意味着它甚至无法访问用户的“图像”字段来更新它。与我关于用户的其他突变相比,它的设置非常相似,我不确定有什么区别。
我觉得我在更新方面缺少一些非常基本的东西。我一直无法找到有效的更新突变示例。有人可以帮忙吗?我的主要问题是:
为什么突变 return 对用户“无效”?
如何设置我的解析器以适当地更新 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
}
}
这允许用户更新他们的个人资料照片信息。希望这对您有所帮助!