2016-07-23 89 views
1

在我的應用程序的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}` 

我想與用戶

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

一起獲取所有職位,但我在終端

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 

請幫助得到下面的錯誤。 在此先感謝。

回答

0

更新#1:

的問題是在posts場的userType定義的實現。

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

雖然解構args,在Rest parameterconnectionArgs應該來到底。首先應該是query。由於休息參數使用錯誤,connectionArgs被發現undefined

順便說一句,你不通過query的職位。如果您不提供query參數,則應該只使用args: {...connectionArgs},


看起來像你已經使用貓鼬庫。如果是這樣的話,一個明顯的問題是在執行getPosts函數。 exec本身returns a promise。所以,它不需要包裹在Promise中。替換此

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(); 
} 

請讓我知道,如果你面對解決這個經過進一步的問題。

+0

感謝您的回覆。但我試過,也已經我控制檯日誌getPosts(),我得到的職位列出他們的。仍然會出現同樣的錯誤。 1.無法讀取屬性''之後'未定義 - \t標誌 \t 或有時會出現錯誤....不能爲非空字段PostConnection.pageInfo返回null。le,content},cursor},pageInfo {hasNextPage,hasPreviousPage}}} – ajooba

+0

您沒有在'schema.js'文件中導入'Post'。導入「Post」後會發生什麼? –

+0

它沒有任何區別,因爲getposts從database.js導入並導入POST。 – akshay

1

今天犯了同樣的錯誤,並花了我一點的時間找到正確的解決方案。我用同樣的問題看了你的問題,但沒有解決我的問題。一段時間後,我注意到我在connectionFromPromisedArray調用中缺少args。所以要解決您的問題請嘗試更改此:

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 
     } 
    },