在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解决:
- 定义自定义注入Token:
// 在orders.module.ts中添加 export const RAZORPAY_CLIENT = Symbol('RAZORPAY_CLIENT');
- 修改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 {}
- 在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
相关产品推荐
相关产品推荐

