我正在尝试使用 GraphQL 和 stripe 创建 API 端点,但是我无法使用 Stripe 的异步调用正确解析数据,而是返回未定义。
这里是调用:
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
将立即返回 undefined
并在操作完成时调用回调。
您可以继续使用回调并将其包装在 Promise 中,但没有必要这样做,因为 stripe 的库支持 Promise。只是不要传入回调,charges.list
将返回一个最终解析为费用列表的 Promise,而不是 undefined
。
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")
}
您的解析器可以返回一个值或一个将解析为该值的 Promise,因此我们可以只返回 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
}
此外,无论其值(value)如何,根据文档,费用已按创建日期排序返回:
The charges are returned in sorted order, with the most recent charges appearing first.
关于javascript - 获取 Stripe 调用以在 GraphQL 架构中解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53109913/