无法在反应中继中获取列表
Unable to fetch list in react relay
我遵循与上述相同的架构
我想获取所有用户,所以我像这样更新了我的架构
var Root = new GraphQLObjectType({
name: 'Root',
fields: () => ({
user: {
type: userType,
resolve: (rootValue, _) => {
return getUser(rootValue)
}
},
post: {
type: postType,
args: {
...connectionArgs,
postID: {type: GraphQLString}
},
resolve: (rootValue, args) => {
return getPost(args.postID).then(function(data){
return data[0];
}).then(null,function(err){
return err;
});
}
},
users:{
type: new GraphQLList(userType),
resolve: (root) =>getUsers(),
},
})
});
并且在database.js
export function getUsers(params) {
console.log("getUsers",params)
return new Promise((resolve, reject) => {
User.find({}).exec({}, function(err, users) {
if (err) {
resolve({})
} else {
resolve(users)
}
});
})
}
我在 /graphql 中得到结果
{
users {
id,
fullName
}
}
结果为
{
"data": {
"users": [
{
"id": "VXNlcjo1Nzk4NWQxNmIwYWYxYWY2MTc3MGJlNTA=",
"fullName": "Akshay"
},
{
"id": "VXNlcjo1Nzk4YTRkNTBjMWJlZTg1MzFmN2IzMzI=",
"fullName": "jitendra"
},
{
"id": "VXNlcjo1NzliNjcyMmRlNjRlZTI2MTFkMWEyMTk=",
"fullName": "akshay1"
},
{
"id": "VXNlcjo1NzliNjgwMDc4YTYwMTZjMTM0ZmMxZWM=",
"fullName": "Akshay2"
},
{
"id": "VXNlcjo1NzlmMTNkYjMzNTNkODQ0MmJjOWQzZDU=",
"fullName": "test"
}
]
}
}
但是如果我尝试以
的形式获取它
export default Relay.createContainer(UserList, {
fragments: {
userslist: () => Relay.QL`
fragment on User @relay(plural: true) {
fullName,
local{
email
},
images{
full
},
currentPostCount,
isPremium,
}
`,
},
});
我遇到错误 Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.
请告诉我我缺少什么。
无论是否使用@relay(plural: true),我都尝试了很多。
还尝试将参数更新为
users:{
type: new GraphQLList(userType),
args: {
names: {
type: GraphQLString,
},
...connectionArgs,
},
resolve: (root, {names}) =>connectionFromArray(getUsers(names)),
},
但我收到错误 Cannot read property 'after' of undefined in implementing react-relay
提前致谢。
中继目前只支持三种类型的根字段(见facebook/relay#112):
- 没有参数的根字段,return单个节点:
- 例如
{ user { id } }
returning {"id": "123"}
- 具有一个参数的根字段,returning 单个节点:
- 例如
{ post(id: "456") { id } }
returning {"id": "456"}
- 具有一个数组参数的根字段return与参数数组大小相同的节点数组(也称为"a plural identifying root field"):
- 例如
{ users(ids: ["123", "321"]) { id } }
returning [{"id": "123"}, {"id": "321"}]
一种解决方法是创建一个根字段(通常称为 viewer
)return 创建一个具有这些字段的节点。当嵌套在 Viewer
(或任何其他节点)内时,字段允许具有任何 return 类型,包括列表或连接。当您在 GraphQL 服务器中包装此对象中的字段后,您可以像这样查询它们:
{
viewer {
users {
id,
fullName,
}
}
}
Viewer
类型是一个节点类型,由于只有一个实例,所以它的id
应该是一个常量。您可以使用 globalIdField
帮助器来定义 id
字段,并添加您想要使用 Relay 查询的任何其他字段:
const viewerType = new GraphQLObjectType({
name: 'Viewer',
interfaces: [nodeInterface],
fields: {
id: globalIdField('Viewer', () => 'VIEWER_ID'),
users:{
type: new GraphQLList(userType),
resolve: (viewer) => getUsers(),
},
},
});
在客户端上,您需要将路由中的根查询更改为 { viewer }
并在 Viewer
上定义片段:
export default Relay.createContainer(UserList, {
fragments: {
viewer: () => Relay.QL`
fragment on Viewer {
users {
fullName,
local {
email,
},
images {
full,
},
currentPostCount,
isPremium,
}
}
`,
},
});
我遵循与上述相同的架构
我想获取所有用户,所以我像这样更新了我的架构
var Root = new GraphQLObjectType({
name: 'Root',
fields: () => ({
user: {
type: userType,
resolve: (rootValue, _) => {
return getUser(rootValue)
}
},
post: {
type: postType,
args: {
...connectionArgs,
postID: {type: GraphQLString}
},
resolve: (rootValue, args) => {
return getPost(args.postID).then(function(data){
return data[0];
}).then(null,function(err){
return err;
});
}
},
users:{
type: new GraphQLList(userType),
resolve: (root) =>getUsers(),
},
})
});
并且在database.js
export function getUsers(params) {
console.log("getUsers",params)
return new Promise((resolve, reject) => {
User.find({}).exec({}, function(err, users) {
if (err) {
resolve({})
} else {
resolve(users)
}
});
})
}
我在 /graphql 中得到结果
{
users {
id,
fullName
}
}
结果为
{
"data": {
"users": [
{
"id": "VXNlcjo1Nzk4NWQxNmIwYWYxYWY2MTc3MGJlNTA=",
"fullName": "Akshay"
},
{
"id": "VXNlcjo1Nzk4YTRkNTBjMWJlZTg1MzFmN2IzMzI=",
"fullName": "jitendra"
},
{
"id": "VXNlcjo1NzliNjcyMmRlNjRlZTI2MTFkMWEyMTk=",
"fullName": "akshay1"
},
{
"id": "VXNlcjo1NzliNjgwMDc4YTYwMTZjMTM0ZmMxZWM=",
"fullName": "Akshay2"
},
{
"id": "VXNlcjo1NzlmMTNkYjMzNTNkODQ0MmJjOWQzZDU=",
"fullName": "test"
}
]
}
}
但是如果我尝试以
的形式获取它export default Relay.createContainer(UserList, {
fragments: {
userslist: () => Relay.QL`
fragment on User @relay(plural: true) {
fullName,
local{
email
},
images{
full
},
currentPostCount,
isPremium,
}
`,
},
});
我遇到错误 Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.
请告诉我我缺少什么。 无论是否使用@relay(plural: true),我都尝试了很多。 还尝试将参数更新为
users:{
type: new GraphQLList(userType),
args: {
names: {
type: GraphQLString,
},
...connectionArgs,
},
resolve: (root, {names}) =>connectionFromArray(getUsers(names)),
},
但我收到错误 Cannot read property 'after' of undefined in implementing react-relay
提前致谢。
中继目前只支持三种类型的根字段(见facebook/relay#112):
- 没有参数的根字段,return单个节点:
- 例如
{ user { id } }
returning{"id": "123"}
- 例如
- 具有一个参数的根字段,returning 单个节点:
- 例如
{ post(id: "456") { id } }
returning{"id": "456"}
- 例如
- 具有一个数组参数的根字段return与参数数组大小相同的节点数组(也称为"a plural identifying root field"):
- 例如
{ users(ids: ["123", "321"]) { id } }
returning[{"id": "123"}, {"id": "321"}]
- 例如
一种解决方法是创建一个根字段(通常称为 viewer
)return 创建一个具有这些字段的节点。当嵌套在 Viewer
(或任何其他节点)内时,字段允许具有任何 return 类型,包括列表或连接。当您在 GraphQL 服务器中包装此对象中的字段后,您可以像这样查询它们:
{
viewer {
users {
id,
fullName,
}
}
}
Viewer
类型是一个节点类型,由于只有一个实例,所以它的id
应该是一个常量。您可以使用 globalIdField
帮助器来定义 id
字段,并添加您想要使用 Relay 查询的任何其他字段:
const viewerType = new GraphQLObjectType({
name: 'Viewer',
interfaces: [nodeInterface],
fields: {
id: globalIdField('Viewer', () => 'VIEWER_ID'),
users:{
type: new GraphQLList(userType),
resolve: (viewer) => getUsers(),
},
},
});
在客户端上,您需要将路由中的根查询更改为 { viewer }
并在 Viewer
上定义片段:
export default Relay.createContainer(UserList, {
fragments: {
viewer: () => Relay.QL`
fragment on Viewer {
users {
fullName,
local {
email,
},
images {
full,
},
currentPostCount,
isPremium,
}
}
`,
},
});