在执行react-relay时,无法读取属性'undefined'

在我的nodejs应用程序中

这是我的schema.js文件

import { GraphQLBoolean, GraphQLID, GraphQLInt, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLSchema, GraphQLString, } from 'graphql'; import { connectionArgs, connectionDefinitions, connectionFromArray, connectionFromPromisedArray, cursorForObjectInConnection, fromGlobalId, globalIdField, mutationWithClientMutationId, nodeDefinitions, toGlobalId, } from 'graphql-relay'; import { User, getUser, getPosts, createpost, } from '../data/database.js'; var { nodeInterface, nodeField } = nodeDefinitions( (globalId) => { var { type, id } = fromGlobalId(globalId); if (type === 'User') { return getUser(id); }else if (type === 'Post') { return getPosts(id); } return null; }, (obj) => { if (obj instanceof User) { return userType; }else if (obj instanceof Post) { return postType; } return null; } ); var userProfileImageType = new GraphQLObjectType({ name: 'ProfileImage', fields: { full: { type: GraphQLString } } }); var userLocalAccountType = new GraphQLObjectType({ name: 'Local', fields: { email: { type: GraphQLString } } }); var userFacebookAccountType = new GraphQLObjectType({ name: 'Facebook', fields: { id: { type: GraphQLString }, displayName: { type: GraphQLString } } }); var userGoogleAccountType = new GraphQLObjectType({ name: 'Google', fields: { id: { type: GraphQLString }, displayName: { type: GraphQLString } } }); var postType = new GraphQLObjectType({ name: 'Post', fields: { id: globalIdField('Post'), title: { type: GraphQLString }, userId: globalIdField('User'), content: { type: GraphQLString } }, interfaces: [nodeInterface] }); /** * Define your own connection types here */ const { connectionType: postConnection, edgeType: postEdge, } = connectionDefinitions({name: 'Post', nodeType: postType}); let createPostMutation = mutationWithClientMutationId({ name: 'CreatePost', inputFields: { title: { type: new GraphQLNonNull(GraphQLString) }, content: { type: new GraphQLNonNull(GraphQLString) }, userId: { type: new GraphQLNonNull(GraphQLString) }, }, outputFields: { postEdge: { type: postConnection, resolve: (obj) => ({ node: obj, cursor: obj.insertedId }) }, }, mutateAndGetPayload: ({title, content,userId}) => { console.log({title, content,userId}) return createpost({title, content,userId}) } }); var userType = new GraphQLObjectType({ name: 'User', fields: { id: globalIdField('User'), fullName: { type: GraphQLString, description: "Users' Full Name" }, isPremium: { type: GraphQLBoolean, description: "Does the user have premium subscription?" }, currentPostCount: { type: GraphQLInt, description: "User's current total post" }, images: { type: userProfileImageType, description: "User's profile image links" }, local: { type: userLocalAccountType, description: "User's local account info" }, facebook: { type: userFacebookAccountType, description: "User's Facebook account info" }, google: { type: userGoogleAccountType, description: "User's Google Plus account info" }, posts: { type: postConnection, args: { ...connectionArgs, query: { type: GraphQLString } }, resolve: (rootValue) => { return connectionFromPromisedArray(getPosts(rootValue)) } }, }, interfaces: [nodeInterface] }); var Root = new GraphQLObjectType({ name: 'Root', fields: () => ({ user: { type: userType, resolve: (rootValue, _) => { return getUser(rootValue) } }, }) }) export var schema = new GraphQLSchema({ query: Root, mutation: new GraphQLObjectType({ name: 'Mutation', fields: () => ({ createPost: createPostMutation }) }) }); 

下面是我的database.js

 import User from './models/userModel' import Post from './models/postModel' export { User } export { Post } export function getUser(user) { let validUser = false if (user.local || user.facebook || user.google) { validUser = true } return new Promise((resolve, reject) => { if (validUser) { let localEmail = user.local.email || "" let googleID = user.google.id || "" let facebookID = user.facebook.id || "" User.findOne({ $or: [ { "local.email": localEmail }, { "facebook.id": facebookID }, { "google.id": googleID } ] }, function(err, existingUser) { if (err || !existingUser) { resolve({}) } else { resolve(existingUser) } }); } else { resolve({}) } }) } export function getPosts(user) { return new Promise((resolve, reject) => { Post.find({}).exec({}, function(err, posts) { resolve(posts) }); }) } export function createpost({title, content,userId}){ return new Promise((resolve, reject) => { const blogPostModel = new Post({title, content,userId}); const newBlogPost = blogPostModel.save(); if (!newBlogPost) { throw new Error('Error adding new blog post'); } resolve({}) }) } 

我正在通过用户

 Relay.QL `query { user}` 

我想要与用户一起获取所有post

 Relay.QL 'query{ user { id, posts(first: 3) { edges { node { id, title } } } } }' 

但我在terminal下面的错误

  Failed to execute query `UserQueries` for the following reasons: 1. Cannot read property 'after' of undefined le {id,displayName},_posts3KBCho:posts(first:3) {edges {node 

请帮忙。 提前致谢。

更新#1:

问题是在userType定义中的posts字段的实现。

 posts: { type: postConnection, args: { ...connectionArgs, query: { type: GraphQLString } }, resolve: (rootValue) => { return connectionFromPromisedArray(getPosts(rootValue)) } }, 

在解构args , Rest参数 connectionArgs应该到最后。 query应该先来。 由于rest参数使用错误, connectionArgs被发现undefined

顺便说一下,你不通过query职位。 如果你不提供query参数,你应该使用args: {...connectionArgs},


看起来你已经使用mongoose库了。 如果是这样的话,一个明显的问题就是getPosts函数的实现。 exec本身就会返回一个承诺 。 所以,它不需要被包裹在一个承诺。 replace这个

 export function getPosts(user) { return new Promise((resolve, reject) => { Post.find({}).exec({}, function(err, posts) { resolve(posts) }); }) } 

有了这个

 export function getPosts(user) { return Post.find({user_id: user._id}).exec(); } 

解决这个问题后,如果遇到更多问题,请告诉我。

今天犯了同样的错误,我花了一点点find正确的解决scheme。 我看着你的问题同样的问题,但没有解决我的问题。 一段时间后,我注意到我在connectionFromPromisedArray调用中缺lessargs 。 所以要解决您的问题尝试改变这一点:

 posts: { type: postConnection, args: { ...connectionArgs, query: { type: GraphQLString } }, resolve: (rootValue, args) => { // <== here is added args attribute return connectionFromPromisedArray(getPosts(rootValue), args) // <== here is added args attribute } },