2016-07-23 5 views
1

В моем nodejs примененияНе удается прочитать свойство «после» неопределенных в осуществлении реакции-реле

здесь файл

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

мой schema.js и ниже мой 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

Update # 1:

Проблема заключается в реализации posts поля в userType определения.

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

Хотя args уничтожение того, то Rest parameterconnectionArgs должен прийти в конце концов. query должен быть первым. Из-за неправильного использования параметров отдыха найдено connectionArgsundefined.

Кстати, вы не проходите query для сообщений. Если вы не указали аргумент query, вы должны просто использовать args: {...connectionArgs},.


Похоже, вы использовали библиотеку Mongoose. Если это так, одна очевидная проблема заключается в реализации функции getPosts. exec сам returns a 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

Спасибо за ответ. Но я попробовал это уже и консоль log getPosts(), и я получаю сообщения о своих списках. все та же ошибка наступает. 1. Невозможно прочитать свойство «after» of undefined - \t flag \t или иногда получить ошибку .... Не удается вернуть значение null для поля, отличного от нуля. PostConnection.pageInfo.le, content}, cursor}, pageInfo {hasNextPage, hasPreviousPage}}} – ajooba

+0

Вы не импортировали 'Post' в свой файл' schema.js'. Что происходит после импорта 'Post'? –

+0

Это не имеет никакого значения, поскольку getposts импортирует из database.js и POST импортируется. – akshay

1

Произошла такая же ошибка сегодня, и мне потребовалось немного найти правильное решение. Я посмотрел на ваш вопрос с той же проблемой, но не решил свою проблему. Через некоторое время я заметил, что мне не хватает args в моем звонке connectionFromPromisedArray. Поэтому, чтобы исправить вашу проблему, попробуйте изменить это:

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