为同一突变的输出对象更新突变中的 graphql 上下文
Update graphql context in a mutation for the output object of the same mutation
我想对应用程序使用单个突变将用户信息发送到服务器,然后在输出中获取顶级查询。 (我知道这不是一个好的约定,但我想这样做是为了测试我是否可以提高性能)。
因此,只有一个突变会获取用户信息和 returns 提要。此突变更新有关在每个查询中获取的用户信息作为请求的上下文。上下文用于生成个性化提要。但是,当我调用此突变时,返回的输出是使用旧上下文计算的。我需要做的是也为这个相同的突变更新上下文。
我放了一个简化版本的代码来展示发生了什么:
const UserType = new GraphQLObjectType({
name: 'User',
fields: () => ({
someData: {
type: GraphQLList(Post),
resolve: (user, args, context) => getFeed(context) // context in here is the old context.
},
})
})
const someMutation = mutationWithClientMutationId({
name: 'someMutation',
inputFields: {
location: { type: GraphQLString },
},
outputFields: {
user: {
type: UserType,
resolve: (source, args, context) => getUser(context.location),
},
},
mutateAndGetPayload: async (data, context) => {
updateUserInfo(data)
// I have tried updating context like this but it's not working.
context = { location: data.location }
return {
// I even tried putting user here like this:
// user: getUser(data.location)
// However, the resulting query fails when running getFeed(context)
// the context is still the old context
}
},
})
这就是 JavaScript 的工作原理。您可以重新分配函数参数的值,但这不会更改传递给函数的值。
function makeTrue (value) {
value = true
console.log(value) // true
}
var myVariable = false
makeTrue(myVariable)
console.log(myVariable) // false
如果你传递给函数的值是对象或数组,你可以改变它,原始值也会改变,因为[=中的对象和数组22=] 通过引用传递。
function makeItTrue (value) {
value.it = true
console.log(value.it) // true
}
var myVariable = { it: false }
makeTrue(myVariable)
console.log(myVariable.it) // true
换句话说,您需要改变 context
参数而不是重新分配它。
我想对应用程序使用单个突变将用户信息发送到服务器,然后在输出中获取顶级查询。 (我知道这不是一个好的约定,但我想这样做是为了测试我是否可以提高性能)。
因此,只有一个突变会获取用户信息和 returns 提要。此突变更新有关在每个查询中获取的用户信息作为请求的上下文。上下文用于生成个性化提要。但是,当我调用此突变时,返回的输出是使用旧上下文计算的。我需要做的是也为这个相同的突变更新上下文。
我放了一个简化版本的代码来展示发生了什么:
const UserType = new GraphQLObjectType({
name: 'User',
fields: () => ({
someData: {
type: GraphQLList(Post),
resolve: (user, args, context) => getFeed(context) // context in here is the old context.
},
})
})
const someMutation = mutationWithClientMutationId({
name: 'someMutation',
inputFields: {
location: { type: GraphQLString },
},
outputFields: {
user: {
type: UserType,
resolve: (source, args, context) => getUser(context.location),
},
},
mutateAndGetPayload: async (data, context) => {
updateUserInfo(data)
// I have tried updating context like this but it's not working.
context = { location: data.location }
return {
// I even tried putting user here like this:
// user: getUser(data.location)
// However, the resulting query fails when running getFeed(context)
// the context is still the old context
}
},
})
这就是 JavaScript 的工作原理。您可以重新分配函数参数的值,但这不会更改传递给函数的值。
function makeTrue (value) {
value = true
console.log(value) // true
}
var myVariable = false
makeTrue(myVariable)
console.log(myVariable) // false
如果你传递给函数的值是对象或数组,你可以改变它,原始值也会改变,因为[=中的对象和数组22=] 通过引用传递。
function makeItTrue (value) {
value.it = true
console.log(value.it) // true
}
var myVariable = { it: false }
makeTrue(myVariable)
console.log(myVariable.it) // true
换句话说,您需要改变 context
参数而不是重新分配它。