如何使用Strapi GraphQL返回条带优惠券
我有一个带有签出页面的Nuxt应用程序,在后端我使用的是Strapi GraphQL。我在Stripe中创建了几个优惠券,我希望能够从结帐页面验证优惠券,但我正在努力找出如何做到这一点。以下是我目前掌握的情况: 前端(Nuxt) Cart.vue: validateCoOn.gql: 后端(Strapi): ./order/config/routes.json: ./order/config/schema.graphql.js: ./order/controllers/order.js: 现在,当我尝试在GraphQL游乐场中运行查询时,得到的错误是如何使用Strapi GraphQL返回条带优惠券,graphql,stripe-payments,strapi,Graphql,Stripe Payments,Strapi,我有一个带有签出页面的Nuxt应用程序,在后端我使用的是Strapi GraphQL。我在Stripe中创建了几个优惠券,我希望能够从结帐页面验证优惠券,但我正在努力找出如何做到这一点。以下是我目前掌握的情况: 前端(Nuxt) Cart.vue: validateCoOn.gql: 后端(Strapi): ./order/config/routes.json: ./order/config/schema.graphql.js: ./order/controllers/order.js: 现在,
strapi.services.order.validateCoOn不是一个函数
我对GraphQL还比较陌生。。。有没有比运行查询更好的获取外部数据的方法
****更新****
我添加了我的订单服务,它消除了最初的错误。现在的问题是,即使服务似乎正确返回优惠券,schema.graphql.js
中的const实体由于某种原因返回未定义的优惠券。我想知道解析器是否不能异步/等待
./order/services/order.js:
嗯,你在条纹上查找优惠券的代码看起来很好!看起来Strapi希望您的服务位于/order/services/order.js
——可能就这么简单吗?您的示例显示在/order/controllers/order.js
上 所以我最终在Strapi内容生成器中创建了一个优惠券模型。这使我能够更轻松地从GraphQL查询返回优惠券对象。这并不理想,因为我必须确保创建一个Stripe和Strapi优惠券对象来匹配,但是我也不希望一开始就创建太多优惠券
我的更新代码如下所示:
schema.graphql.js:
./order/controllers/order.js:
./order/services/order.js:
我实际上添加了一个服务功能,似乎已经解决了这个问题,我已经用这个代码更新了我原来的帖子。
this.$apollo.query({
query: validateCouponQuery,
variables: {
coupon: this.coupon
}
})
query($coupon: String!) {
validateCoupon(coupon: $coupon) {
id
name
valid
}
}
{
"method": "GET",
"path": "/orders/validateCoupon",
"handler": "order.validateCoupon",
"config": {
"policies": []
}
}
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 });
}
}
}
}
}
'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)
}
}
};
'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));
}
};
const { sanitizeEntity } = require('strapi-utils/lib');
module.exports = {
query: `
validateCoupon(coupon: String): Coupon
`,
resolver: {
Query: {
validateCoupon: {
description: 'Validate Stripe coupon',
resolver: 'application::order.order.validateCoupon',
}
}
}
}
'use strict';
require('dotenv').config();
const { sanitizeEntity } = require('strapi-utils');
module.exports = {
validateCoupon: async ctx => {
const coupon = ctx.query._coupon;
const found = await strapi.services.order.validateCoupon({ coupon });
return sanitizeEntity(found, { model: strapi.models.order });
}
};
'use strict';
const stripe = require('stripe')(`${process.env.STRIPE_SECRET_KEY}`);
module.exports = {
async validateCoupon({ coupon }) {
let foundCoupon = null;
try {
const coupons = await stripe.coupons.list();
const found = coupons.data.filter(c => {
return (c.name === coupon && c.valid) ? c : null;
});
if (found) foundCoupon = found[0];
} catch (err) {
console.error(err);
}
return foundCoupon;
}
};