gpt4 book ai didi

javascript - graphql 将动态数据传递给突变

转载 作者:行者123 更新时间:2023-11-30 19:12:42 25 4
gpt4 key购买 nike

以前没有使用过 graphqlmongodb。为更新突变传递对象的正确方法是什么?

因为我看到传递多个动态出现的参数的唯一其他方法是使用 input 类型,这对我来说似乎有点无效(就代码的外观而言,尤其是对于更大的对象),我只是传递可能的值本身。然而在这种情况下,我需要动态构造 updateObject,这对于更大的模型来说又会变得困惑。

例如现在我做了:

Mutation: {
updateHub: async (_, { id, url, ports, enabled }) => {
const query = {'_id': id};
const updateFields = {
...(url? {url: url} : null),
...(ports? {ports: ports} : null),
...(enabled? {enabled: enabled} : null)
};
const result = await HubStore.findByIdAndUpdate(query, updateFields);
return {
success: !result ? false : true,
message: 'updated',
hub: result
};
}
}

关于处理此问题的更好方法有什么建议吗?

谢谢!

最佳答案

看来您的代码可以从使用 ES6 扩展语法中获益——它允许您处理 args 对象中的任意数量的属性,而无需串行三级语句。

Mutation: {
updateHub: async (_, { id, ...restArgs } ) => {
const query = {'_id': id};
const updateFields = { ...restArgs };
const result = await HubStore.findByIdAndUpdate(query, updateFields);
return {
success: !result ? false : true,
message: 'updated',
hub: result
};
}
}

如果由于某种原因你需要在你的对象中显式地将未定义的属性设置为 null,你可以使用一些配置对象和方法,比如来自 lodash 的 defaults库如下图:

import { defaults } from 'lodash';
const nullFill = { url: null, ports: null, enabled: null }; // include any other properties that may be needed

Mutation: {
updateHub: async (_, { id, ...restArgs } ) => {
const query = {'_id': id};
const updateFields = defaults(restArgs, nullFill);
const result = await HubStore.findByIdAndUpdate(query, updateFields);
return {
success: !result ? false : true,
message: 'updated',
hub: result
};
}
}

此外,FWIW,我会考虑将可能更新的动态参数放在其自己的输入类型上,例如在这种情况下的 HubInput,如 graphql docs 中所建议的那样.下面我展示了这如何与您的突变一起使用。请注意,由于 HubInput 上没有任何内容被标记为 requird (!),您可以传递动态属性集合以进行更新。还要注意,如果你采用这种方法,你将需要在你的突变中正确地解构你的 args 对象,比如 { id, input }

    input HubInput {
url: String
ports: // whatever this type is, like [String]
enabled: Boolean
// ...Anything else that might need updating
}

type UpdateHubPayload {
success: Boolean
message: String
hub: Hub // assumes you have defined a type Hub
}

updateHub(id: Int, input: HubInput!): UpdateHubPayload

关于javascript - graphql 将动态数据传递给突变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58315060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com