GraphQL - 传递一个 ObjectType 参数
GraphQL - passing an ObjectType a parameter
我正在使用 GraphQL
,它运行良好,但是,我似乎无法弄清楚如何将参数传递到 Event GraphQLObjectType
的 fields
部分。
我希望能够将 currentUserId
(通过令牌提供给我)传递到 Event GraphQLObjectType
中,以便我可以添加 isAttending
属性。
我附上了代码,其中包含我基本上想做的事情的注释:
const Event = new GraphQLObjectType({
name: 'Event',
description: 'This represents an Event',
fields: (currentUserId) => { // currentUserId is the parameter I would like to pass in
return {
id: {
type: GraphQLInt,
resolve (event) {
return event.id;
}
},
title: {
type: GraphQLString,
resolve (event) {
return event.title;
}
},
attendees: {
type: new GraphQLList(User),
resolve (event) {
return event.getAttendees()
}
},
// this is what I would like to do
isAttending: {
type: GraphQLBool,
resolve (event) {
return event.getAttendees({
where: {
id: currentUserId // that's the parameter I would like pass in
}
}).then(attendee => {
return (attendee.length > 0 ? true : false);
)};
}
}
// end of what I'm trying to do //
};
}
});
const Query = new GraphQLObjectType({
name: 'Query',
description: 'Root query object',
fields: () => {
return {
events: {
type: new GraphQLList(Event),
args: {
id: {
type: GraphQLInt
}
},
resolve (root, args) {
// here is the parameter I would like to pass to the event object
let currentUserId = root.userId;
////////
return Db.models.event.findAll({ where: args });
}
},
...
更新
我不能只做 data.currentUserId = root.userId
的原因是当我返回 collection of event objects
时它不可见,因为传递到我的 Event GraphQLOBjectType
的只是{event}
对象。
当我执行 data.currentUserId
并且 data
中有一个对象数组时,它看起来像这样:
[{objects}, currentUserId: 1]
与我们想要的相反:
[{object, currentUserId: 1}, {anotherObject, currentUserId: 1}]
如果我想访问 Event GraphQLObject
中的 currentUserId
,我唯一能想到的就是遍历每个对象并将 currentUserId 添加到它上面,如下所示:
return events.map(event => {
event.currentUserId = currentUserId;
return event;
});`
这是最好的解决方案吗?
恐怕你做不到。 fields
没有收到任何参数,所以你也不会发送任何参数。
幸运的是,您可以通过更方便的方式实现。
resolve
函数中父类型 (Query
) returns 的所有内容都在子解析的 root
参数中可见。
const Query = new GraphQLObjectType({
name: 'Query',
description: 'Root query object',
fields: () => ({
events: {
type: new GraphQLList(Event),
args: {
id: {
type: GraphQLInt
}
},
resolve (root, args) {
return Db.models.event.findAll({ where: args })
.then(data => {
// pass the parameter here
data.currentUserId = root.userId;
return data;
});
}
},
...
那么您的 Event
对象将如下所示:
const Event = new GraphQLObjectType({
name: 'Event',
description: 'This represents an Event',
fields: () => ({
...
isAttending: {
type: GraphQLBool,
resolve: (event) => {
return event.getAttendees({
where: {
id: event.currentUserId // that's the parameter you've passed through parent resolve
}
}).then(attendee => {
return (attendee.length > 0 ? true : false);
});
}
}
})
});
我正在使用 GraphQL
,它运行良好,但是,我似乎无法弄清楚如何将参数传递到 Event GraphQLObjectType
的 fields
部分。
我希望能够将 currentUserId
(通过令牌提供给我)传递到 Event GraphQLObjectType
中,以便我可以添加 isAttending
属性。
我附上了代码,其中包含我基本上想做的事情的注释:
const Event = new GraphQLObjectType({
name: 'Event',
description: 'This represents an Event',
fields: (currentUserId) => { // currentUserId is the parameter I would like to pass in
return {
id: {
type: GraphQLInt,
resolve (event) {
return event.id;
}
},
title: {
type: GraphQLString,
resolve (event) {
return event.title;
}
},
attendees: {
type: new GraphQLList(User),
resolve (event) {
return event.getAttendees()
}
},
// this is what I would like to do
isAttending: {
type: GraphQLBool,
resolve (event) {
return event.getAttendees({
where: {
id: currentUserId // that's the parameter I would like pass in
}
}).then(attendee => {
return (attendee.length > 0 ? true : false);
)};
}
}
// end of what I'm trying to do //
};
}
});
const Query = new GraphQLObjectType({
name: 'Query',
description: 'Root query object',
fields: () => {
return {
events: {
type: new GraphQLList(Event),
args: {
id: {
type: GraphQLInt
}
},
resolve (root, args) {
// here is the parameter I would like to pass to the event object
let currentUserId = root.userId;
////////
return Db.models.event.findAll({ where: args });
}
},
...
更新
我不能只做 data.currentUserId = root.userId
的原因是当我返回 collection of event objects
时它不可见,因为传递到我的 Event GraphQLOBjectType
的只是{event}
对象。
当我执行 data.currentUserId
并且 data
中有一个对象数组时,它看起来像这样:
[{objects}, currentUserId: 1]
与我们想要的相反:
[{object, currentUserId: 1}, {anotherObject, currentUserId: 1}]
如果我想访问 Event GraphQLObject
中的 currentUserId
,我唯一能想到的就是遍历每个对象并将 currentUserId 添加到它上面,如下所示:
return events.map(event => {
event.currentUserId = currentUserId;
return event;
});`
这是最好的解决方案吗?
恐怕你做不到。 fields
没有收到任何参数,所以你也不会发送任何参数。
幸运的是,您可以通过更方便的方式实现。
resolve
函数中父类型 (Query
) returns 的所有内容都在子解析的 root
参数中可见。
const Query = new GraphQLObjectType({
name: 'Query',
description: 'Root query object',
fields: () => ({
events: {
type: new GraphQLList(Event),
args: {
id: {
type: GraphQLInt
}
},
resolve (root, args) {
return Db.models.event.findAll({ where: args })
.then(data => {
// pass the parameter here
data.currentUserId = root.userId;
return data;
});
}
},
...
那么您的 Event
对象将如下所示:
const Event = new GraphQLObjectType({
name: 'Event',
description: 'This represents an Event',
fields: () => ({
...
isAttending: {
type: GraphQLBool,
resolve: (event) => {
return event.getAttendees({
where: {
id: event.currentUserId // that's the parameter you've passed through parent resolve
}
}).then(attendee => {
return (attendee.length > 0 ? true : false);
});
}
}
})
});