Return 来自 Graphql 解析的列表

Return list from Graphql resolve

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 回调中获取用户对象。该特定对象调用 getFriends,它是猫鼬插件(朋友的朋友)的一部分,getFriends 回调中的 console.log 包含终端中的列表,所以我知道 getFriends return 正在处理正确的数据,但我无法弄清楚如何将值 return 放入我的 React-Native 组件中。在过去的 8 小时里,我已经尝试了所有我能想到的方法,但无法从该函数中得到 returned 的值。

您已经接近了,但是在使用解析器时需要记住以下几点:

  • 您的解析器必须 return 一个与架构中指定的 type/scalar 相匹配的值 或者 将解析为该值的 Promise。

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

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

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

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