获取 Stripe 调用以在 GraphQL 模式中解析

Getting Stripe call to resolve in GraphQL schema

我正在尝试使用 GraphQL 和 stripe 创建一个 API 端点,但是我无法通过 Stripe 的异步调用正确解析数据,而是 returns 未定义。

调用如下:

app.use('/', graphqlHTTP(req => {
const charges = limit => stripe.charges.list({ limit: limit }, (err, charges) => {
    charges = _.orderBy(charges, "created", "desc")
    return charges
})
return {
    schema,
    context: {
        charges
    },
    graphiql: true
}
}))

架构如下:

module.exports = new GraphQLSchema({
query: new GraphQLObjectType({
    name: 'StripeCharges',
    description: 'These are Stripe charges made to store',
    fields: () => ({
        stripeCharge: {
            type: GraphQLList(StripeChargeType),
            args: {
                limit: { type: GraphQLInt }
            },
            resolve: (root, args, context, info) => {
                console.log(context.charges(args.limit))
                return context.charges(args.limit)
            }
        }
    })
 })
})

在回调中返回一个值通常不会做任何事情。当您包含回调时,charges.list 将立即 return undefined 并在操作完成时调用回调。

可以继续使用回调并将其包装在 Promise 中,但没有必要这样做,因为 stripe 的库支持 Promise。只是不要传入回调,而不是 undefinedcharges.list 将 return 最终解析为费用列表的 Promise。

function getCharges (limit) {
  return stripe.charges.list({ limit: limit }) // returns a promise
    .then(charges => {
      return _.orderBy(charges, "created", "desc")
    })
}

// with async/await, async functions always return a Promise
async function getCharges (limit) {
  const charges = await stripe.charges.list({ limit: limit })
  return _.orderBy(charges, "created", "desc")
}

您的解析器可以 return 一个值或一个将解析为该值的 Promise,因此我们可以 return return 由 getCharges 编辑的值:

resolve: (root, args, context, info) => getCharges(args.limit)

或者,如果您想操纵分解器中的电荷

resolve: async (root, args, context, info) => {
  let charges = await getCharges(args.limit)
  // do whatever
  return charges
}

此外,根据文档,收费已经 return 按创建日期排序:

The charges are returned in sorted order, with the most recent charges appearing first.