Получение вызова Stripe для разрешения в схеме GraphQL - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь создать конечную точку API с использованием GraphQL и stripe, однако я не могу получить данные для правильного разрешения с помощью асинхронного вызова Stripe, вместо этого он возвращает undefined.

Вот звонок:

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

1 Ответ

0 голосов
/ 02 ноября 2018

Возврат значения внутри обратного вызова обычно ничего не делает. Когда вы включаете обратный вызов, charges.list немедленно возвращает undefined и вызывает обратный вызов после завершения операции.

Вы могли бы продолжать использовать обратный вызов и переносить его в Promise, но делать это не нужно, поскольку библиотека stripe поддерживает Promises. Только не передавайте обратный вызов, и вместо undefined, charges.list вернет Обещание, которое в конечном итоге разрешится в списке расходов.

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
}

Кроме того, согласно документам, расходы уже возвращены, отсортированные по дате создания:

Сборы возвращаются в отсортированном порядке, причем самые последние сборы появляются первыми.

...