从Graphql解析返回列表

时间:2017-09-04 18:40:40

标签: react-native mongoose callback graphql graphql-js

fetchFriends: {
  type: new GraphQLList(UserType),
  args: {
    currentId: { type: new GraphQLNonNull(GraphQLID) }
  },
  resolve: (_, {currentId}) => {
    return Promise.resolve()
      .then(() => {
        User.findById(currentId, (err, users) => {
          users.getFriends((err, user) => {
            console.log(user);
            return user;
          });
        });
      })

  }
  /* another version what i tried that returns only the initial findById user 
    resolve: (_, {currentId}) => {
    var value = User.findById(currentId, (err, user) => {
      new Promise((resolve, reject) => {
        user.getFriends((err, user) => {
          console.log('fetch: ', user);
          err ? reject(err) : resolve(user)
        });
      })
    })
    return value;
  }*/
},

我有一个graphql解析,我在findById回调中获取User对象。该特定对象调用getFriends,它是mongoose插件(朋友的朋友)的一部分,getFriends回调中的console.log包含终端中的列表,所以我知道getFriends  正在返回正确的数据,但我无法弄清楚如何将值返回到我的React-Native组件。我已经尝试了过去8小时我能想到的一切,并且无法从这个函数中获得返回的值。

1 个答案:

答案 0 :(得分:2)

你很接近,但在使用解析器时需要记住几件事:

  • 您的解析器必须返回 一个与您的架构中指定的类型/标量匹配的值一个将解析为该值的Promise。

  • Mongoose操作can return a promises,你应该利用它们的这个功能,而不是试图在Promises中包装回调,因为这很容易弄乱

  • 至少在此上下文中返回回调内的语句)实际上并没有做任何事情。另一方面,返回then内的语句,确定承诺将解决的内容(或链中接下来要调用的承诺)。

我想你的解析器需要看起来像这样:

resolve (_, {currentId}) => {
  // calling exec() on the query turns it into a promise
  return User.findById(currentId).exec()
    // the value the promise resolves to is accessible in the "then" method
    .then(user => {
      // should make sure user is not null here, something like:
      if (!user) return Promise.reject(new Error('no user found with that id'))
      // we want the value returned by another async method, getFriends, so
      // wrap that call in a promise, and return the promise
      return new Promise((resolve, reject) => {
        user.getFriends((error, friends) => {
          if (error) reject(error)
          resolve(friends)
        })
      })
    })
}