// didn't add node definitions because this problem occurs on initial data fetch
// user type
const userType = new GraphQLObjectType({
name: 'User',
fields: () => ({
id: globalIdField('User'),
email: { type: GraphQLString },
posts: {
type: postConnection,
args: connectionArgs,
// getUserPosts() function is below
resolve: (user, args) => connectionFromArray(getUserPosts(user.id), args),
},
}),
interfaces: [nodeInterface],
})
// post type
const postType = new GraphQLObjectType({
name: 'Post',
fields: () => ({
id: globalIdField('Post'),
title: { type: GraphQLString },
content: { type: GraphQLString },
}),
interfaces: [nodeInterface],
})
// connection type
const {connectionType: postConnection} =
connectionDefinitions({name: 'Post', nodeType: postType})
// Mongoose query on other file
exports.getUserPosts = (userid) => {
return new Promise((resolve, reject) => {
Post.find({'author': userid}).exec((err, res) => {
err ? reject(err) : resolve(res)
})
})
}
ブラウザ コンソールに次の警告が表示されます。
クエリのサーバー要求は
App
、次の理由で失敗しました:
未定義のプロパティ「長さ」を読み取ることができません
_posts40BFVD:posts(first:10) {
^^^
それが私が得た唯一の情報であり、これ以上エラーや参照はありません。その理由は何ですか?
このコードはRelay-starter-kitWidget
からのものです。すべてのコードをに置き換えただけPost
です。すべてがスターターとほぼ同じであるため、原因はデータベース コードのどこかにあると思います。
しかし、同じ構造を返すため、問題がわかりませんgetUserPosts()
:オブジェクトの配列..
なにが問題だったの?
resolve: (user, args) => connectionFromArray(getUserPosts(user.id), args)
getUserPosts()
promise を返しました (コードをブロックするのはおそらく悪い考えです) が、コールバックはありませんでした。私の意見ではconnectionFromArray()
、コードの実行は続行されましたが、getUserPosts()
まだデータがなかったため、システム全体が失敗しました。
考えられる解決策の 1 つ
とにかくBabelとJavaScriptの「将来の機能」を使用するので、async
andを使用することにしawait
ました。しかし、まだ問題がありgetUserPosts()
、空の配列が返されました。
await
次に、async
関数内で別の関数が呼び出された場合、別の関数も同様に呼び出される必要があることを発見しました。async
そうしないと、すべてawait-s
失敗します。動作する私の最終的な解決策は次のとおりです。
// async function that makes db query
exports.getUserPosts = async (userId) => {
try {
// db query
const posts = await Post.find({author: args}).exec()
return posts
} catch (err) {
return err
}
}
// and resolve method in Schema, also async
resolve: async (user, args) => {
const posts = await getUserPosts(user._id)
return connectionFromArray(posts, args)
}
それが最善の方法であるかどうかはまだわかりません。私の論理では、ノードでは可能な限り async を使用する必要がありますが、私はノードの専門家からはほど遠いと言っています。詳細がわかり次第、質問を更新します。
Relayを使用してこのデータベースクエリの状況に対処するためのより良い方法、または推奨される方法があるかどうかを知りたい.