私は、同様の変異を実行したときに何が返されるのか奇妙な点に遭遇しました。私はちょうどこのスタックを学んで、私はmongooseと私のデータベース層としてmongodbを実装します。Graphql Apollo React:nullを返すことはできません。
私は2つの単純な突然変異を持っています。ユーザーを作成し、それをデータベースの別名レジスタに追加します。もう一方は最初のユーザーオブジェクトが作成された後に明らかにプロフィール写真を追加します。
両方のリゾルバは完全なユーザオブジェクトを返すので、ui、storeなどの更新にはいいです。サブスクリプションの実装を計画していますので、新しいデータを取得することが重要です。
私はgraphiqlを使って作業していて、奇妙な問題に遭遇しました。イメージのURLがdbに保存されていても、私の更新リゾルバはnullを返していました。レジスタリゾルバはすべてのユーザフィールドを返していました。
リゾルバの戻りオブジェクトをコンソールにログ記録すると、両方の関数が完全なユーザーオブジェクトを返していました。
私が返すオブジェクトをnullにできないようにしようとすると、エラーが返されます。
私のリゾルバは、最初にfindOneAndUpdateをコールバックで使用していましたが、実際にはユーザオブジェクトを返していました。はい、私はまだヌルになっていました。奇妙な。
代わりに私のリゾルバを手作業で変更しました。私はfindOneでユーザIDを渡して既存のユーザを検索し、次に明示的にuser.profilePic = "url of pic"とユーザオブジェクト全体の呼び出しを保存し、ユーザオブジェクトをそのコールバックに戻して返信します。ブーム、それは動作します!
この原因は何ですか?私はこれがコールバックを待たずに何らかの形でタイミングと関係があるという初期の気持ちを持っています....なぜ私の最初のアプローチがうまくいかず、私の2番目のことが分かりません。私はタイミングの深い理解を持つ誰かのためにコードを添付したり、おそらく非同期関数がチャイムインすることができます。おそらく私のスタイルをコールバックから約束または非同期待ちに更新する必要があります。
//this one doesnt work
addProfilePic: (root, { input }, context) => {
let update = { profilePic: input.profilePic };
let query = { id: input.id };
let options = { new: true, upsert: true};
let callback = ((err, user) => {
if(err) console.log(err.message);
return user;
})
return updatedUser = User.findOneAndUpdate(query, update, options, callback)
}
//this one works, but returns old user object to client...
//so really, no, it doesn't work
addProfilePic: (root, { input }, context) => {
return User.findOne({id: input.id}, ((err,user) => {
if(err)console.log(err);
if(user){
user.profilePic = input.profilePic;
user.save((err) => {
if(err)console.log(err);
console.log(user);
return user;
})
}
})
})
注記:コンテキストに渡して、私は実際に私は、コンテキストからIDを取得します実装し、それらがログインしているときにユーザーが含まれてい 注:これらはすぐにクールなツールですが、たくさん学ぶために、特に3ヶ月のコーディング経験を持つ人のために...
あなたは正しいです、私は元のfindOneユーザオブジェクトを返していたことに気付きました.Graphicsが正しい最新のデータを表示していましたが。私はこのパターンもエラーのために好きです、それは私がそれをやっていた方法が退屈になります。私はこのスタックの標準的なパターンを見つけるのは難しいと感じました。非常に有用なアドバイス。 – benjaminadk
@benjaminadk [これはGraphQLの例の一覧です](https://github.com/chentsulin/awesome-graphql)。あなたが参考になるかもしれないマングースを使用するカップルがあります。 –