У меня есть приложение Nuxt со страницей оформления заказа, а на бэкэнде я использую Strapi GraphQL. Я создал несколько купонов в Stripe, и я хочу иметь возможность проверять купоны на странице оформления заказа, но я изо всех сил пытаюсь понять, как это сделать. Вот что у меня есть:
Frontend (Nuxt)
Cart. vue:
this.$apollo.query({
query: validateCouponQuery,
variables: {
coupon: this.coupon
}
})
validateCoupon.gql:
query($coupon: String!) {
validateCoupon(coupon: $coupon) {
id
name
valid
}
}
Backend (Strapi): . / Order / config / routes. json:
{
"method": "GET",
"path": "/orders/validateCoupon",
"handler": "order.validateCoupon",
"config": {
"policies": []
}
}
. / Order / config / schema.graphql. js:
const { sanitizeEntity } = require('strapi-utils');
module.exports = {
query: `
validateCoupon(coupon: String): Order
`,
resolver: {
Query: {
validateCoupon: {
resolverOf: 'Order.validateCoupon',
async resolver(_, { coupon }) {
const entity = await strapi.services.order.validateCoupon({ coupon });
return sanitizeEntity(entity, { model: strapi.models.order });
}
}
}
}
}
. / Order / controllers / order. js :
'use strict';
require('dotenv').config();
const stripe = require('stripe')(`${process.env.STRIPE_SECRET_KEY}`);
module.exports = {
validateCoupon: async ctx => {
const { coupon } = ctx.request.body;
console.log('request coupon: ', coupon);
try {
const coupons = await stripe.coupons.list({ limit: 3 }, function (err, coupons) {
console.log('err: ', err);
console.log('coupons: ', coupons);
});
return coupons;
} catch (err) {
console.error('error validating coupon: ', err)
}
}
};
Прямо сейчас, когда я пытаюсь запустить запрос в GraphQL Playground, я получаю сообщение об ошибке strapi.services.order.validateCoupon is not a function
.
Я новичок в GraphQL ... есть ли лучший способ получить внешние данные, чем запуск запроса?
**** Обновление ****
Я добавил свою службу заказов, в которой устранена исходная ошибка. Теперь проблема в том, что, хотя служба, похоже, возвращает купон правильно, const entity
в schema.graphql.js
по какой-то причине возвращает undefined. Интересно, не может ли резолвер быть async / await?
. / Order / services / order. js:
'use strict';
const stripe = require('stripe')(`${process.env.STRIPE_SECRET_KEY}`);
module.exports = {
validateCoupon: ({ coupon }) => {
stripe.coupons.list()
.then(coupons => {
return coupons.data.filter(c => {
return (c.name === coupon && c.valid) ? c : null;
});
console.log('found: ', found);
})
.catch(err => console.error(err));
}
};