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

在Nest JS应用中使用Razorpay Nodejs SDK遇问题求助

在NestJS中集成Razorpay Node SDK的问题

我正在尝试在NestJS应用中使用Razorpay Node SDK,尝试了两种创建Razorpay实例的方式,但均出现报错:

方式一:在Service构造函数中直接实例化

代码:

@Injectable()
export class OrdersService {
  private razorpay: Razorpay;
  constructor(
    private readonly logger: Logger,
    @InjectRepository(BreOrders)
    private readonly orderRepository: Repository<BreOrders>,
  ) {
    this.razorpay = new Razorpay({
      key_id: "YOUR_KEY_ID",
      key_secret: "YOUR_KEY_SECRET",
    });
  }
 }

报错信息:

TypeError: razorpay_1.default is not a constructor

方式二:通过NestJS依赖注入创建实例

OrdersModule代码:

@Module({
  imports: [TypeOrmModule.forFeature([BreOrders]), EmailModule],
  controllers: [OrdersController],
  providers: [
    {
      provide: Razorpay,
      useFactory: () =>
        new Razorpay({
          key_id: process.env.RAZORPAY_KEY,
          key_secret: process.env.RAZORPAY_SECRET,
        }),
    },
    OrdersService,
    Logger,
  ],
  exports: [OrdersService],
})
export class OrdersModule {}

OrdersService代码:

export class OrdersService {
  constructor(
    private readonly logger: Logger,
    @InjectRepository(BreOrders)
    private readonly orderRepository: Repository<BreOrders>,
    private readonly razorpay: Razorpay,
  ) {}

报错信息:

ERROR [ExceptionHandler] Nest can't resolve dependencies of the OrdersService (Logger, BreOrdersRepository, ?). Please make sure that the argument dependency at index [2] is available in the OrdersModule context.

问题原因及解决方法

针对方式一的报错:razorpay_1.default is not a constructor

这是因为Razorpay Node SDK采用命名导出而非默认导出,TypeScript中需修正导入语句:

  • 错误导入:import Razorpay from 'razorpay';
  • 正确导入:import { Razorpay } from 'razorpay';

修正导入后,方式一中的实例化逻辑即可正常运行。

针对方式二的依赖注入报错

核心原因是Nest无法将Razorpay识别为合法的注入标识,需通过自定义Token解决:

  1. 定义自定义注入Token:
// 在orders.module.ts中添加
export const RAZORPAY_CLIENT = Symbol('RAZORPAY_CLIENT');
  1. 修改Module中的Provider配置:
@Module({
  imports: [TypeOrmModule.forFeature([BreOrders]), EmailModule],
  controllers: [OrdersController],
  providers: [
    {
      provide: RAZORPAY_CLIENT,
      useFactory: () =>
        new Razorpay({
          key_id: process.env.RAZORPAY_KEY,
          key_secret: process.env.RAZORPAY_SECRET,
        }),
    },
    OrdersService,
    Logger,
  ],
  exports: [OrdersService, RAZORPAY_CLIENT], // 若其他模块需使用则导出Token
})
export class OrdersModule {}
  1. 在Service中注入实例:
import { Inject } from '@nestjs/common';
import { RAZORPAY_CLIENT } from './orders.module';

export class OrdersService {
  constructor(
    private readonly logger: Logger,
    @InjectRepository(BreOrders)
    private readonly orderRepository: Repository<BreOrders>,
    @Inject(RAZORPAY_CLIENT) private readonly razorpay: Razorpay,
  ) {}
}

完成以上修改后,即可通过依赖注入正常获取Razorpay实例,解决依赖解析失败问题。


内容的提问来源于stack exchange,提问作者Abhimanyu Patil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:45:14