如何使用Strapi 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: 现在,

我有一个带有签出页面的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.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;
  }
};