You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React项目集成Stripe遇TypeScript错误,求助解决方案

解决Stripe集成中的两个TypeScript错误

错误1:Stripe导入报错(This expression is not callable)

问题原因

Stripe的Node.js库在TypeScript环境下,require("stripe")返回的是包含默认导出的模块对象,而非直接可调用的构造函数,直接调用会提示无调用签名。

解决方案

两种修改方式任选其一:

  • 调整require语法,获取默认导出
const stripe = require("stripe").default(process.env.STRIPE_KEY);
  • 改用ES模块导入(更符合TypeScript规范,同时指定API版本避免Stripe警告)
import Stripe from 'stripe';
const stripe = new Stripe(process.env.STRIPE_KEY as string, {
  apiVersion: '2024-06-20'
});

错误2:ctx.request.body不存在(Property 'body' does not exist on type 'Request')

问题原因

Strapi默认的Request类型未包含body属性定义,TypeScript无法识别解析后的请求体类型。

解决方案

三种方式任选其一:

  • 类型断言(快速临时解决)
const { products } = ctx.request.body as { products: Array<{ id: number; quantity: number }> };
  • 扩展Strapi上下文类型(长期规范方案)
    在src/types/strapi.d.ts中创建类型声明文件:
import { Request } from '@strapi/strapi';

declare module '@strapi/strapi' {
  export interface Request {
    body: Record<string, any>;
  }
}
  • 使用泛型指定上下文类型(精准定义请求体结构)
import type { Context } from '@strapi/strapi';

async create(ctx: Context<{
  request: {
    body: { products: Array<{ id: number; quantity: number }> }
  }
}>) {
  const { products } = ctx.request.body;
  // 后续代码...
}

完整修正后的代码示例

import Stripe from 'stripe';
import { createCoreController } from '@strapi/strapi/factories';
import type { Context } from '@strapi/strapi';

const stripe = new Stripe(process.env.STRIPE_KEY as string, {
  apiVersion: '2024-06-20'
});

export default createCoreController('api::order.order', ({ strapi }) => ({
  async create(ctx: Context<{
    request: {
      body: { products: Array<{ id: number; quantity: number }> }
    }
  }>) {
    const { products } = ctx.request.body;
    try {
      const lineItems = await Promise.all(
        products.map(async (product) => {
          const item = await strapi
            .service('api::product.product')
            .findOne(product.id);

          return {
            price_data: {
              currency: 'usd',
              product_data: {
                name: item.title,
              },
              unit_amount: Math.round(item.price * 100),
            },
            quantity: product.quantity,
          };
        })
      );

      const session = await stripe.checkout.sessions.create({
        shipping_address_collection: { allowed_countries: ['US', 'CA'] },
        payment_method_types: ['card'],
        mode: 'payment',
        success_url: `${process.env.CLIENT_URL}?success=true`,
        cancel_url: `${process.env.CLIENT_URL}?success=false`,
        line_items: lineItems,
      });

      await strapi
        .service('api::order.order')
        .create({ data: { products, stripeId: session.id } });

      return { stripeSession: session };
    } catch (error) {
      ctx.response.status = 500;
      return { error };
    }
  },
}));

内容的提问来源于stack exchange,提问作者Yash Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:33:14