如何让模块函数同时访问多个this上下文?(Prisma+类场景)
解决方案
JS 函数只能绑定一个this,要同时获取 Prisma 上下文和类实例的引用,得把其中一个作为显式参数传递。结合你的 Prisma 扩展场景,具体调整如下:
1. 修改独立模块的method1,接受类实例参数
让method1保留 Prisma 上下文的this,同时新增参数接收类实例:
// file: method1.mjs import { Prisma } from '@prisma/client'; /** * @template T * @this {T} Prisma上下文(通过call绑定) * @param {Object} classThis 类实例引用 * @param {Object} args 业务参数 */ export async function method1(classThis, args) { // 保留原有的Prisma上下文逻辑 const ctx = Prisma.getExtensionContext(this); // 直接访问类实例的方法和属性 classThis.sayHello('Hello!'); console.log('配置参数:', classThis.configArg); // 执行你的Prisma操作 // return await ctx.someModel.findUnique({ where: args.id }); }
2. 调整类的实现,通过闭包传递类实例给Prisma扩展
类里不能用箭头函数作为 Prisma 扩展方法(箭头函数的this无法被 Prisma 修改),改用普通函数配合闭包保存类实例引用:
// file myClass.mjs import { method1 } from './method1.mjs'; import { PrismaClient } from '@prisma/client'; export class MyClass { private readonly configArg; public prisma; constructor(configArg) { this.configArg = configArg; // 保存类实例引用到闭包中 const classThis = this; // 创建带扩展的Prisma客户端 this.prisma = new PrismaClient().$extends({ model: { // 替换成你要扩展的模型名 someModel: { method1: async function(args) { // this 是Prisma上下文,classThis 是类实例 return await method1.call(this, classThis, { ...args, // 按需把类的属性传递给method1 config: classThis.configArg }); } } } }); } sayHello = (greeting) => console.log(greeting); }
3. 调用方式
现在可以正常使用类实例的 Prisma 客户端,方法会同时拿到 Prisma 上下文和类实例:
const myInstance = new MyClass({ apiKey: 'xxx' }); await myInstance.prisma.someModel.method1({ id: 1 });
关键说明
- 不要用箭头函数作为 Prisma 扩展方法:箭头函数的
this绑定的是定义时的上下文(类实例),无法接收 Prisma 传递的上下文。 - 闭包保存类实例:在构造函数里把
this赋值给变量classThis,这样 Prisma 扩展的普通函数就能访问到类实例,同时自身的this是 Prisma 上下文。 - 显式传递参数:类的属性可以通过闭包直接访问,也可以放到
args里传递给method1,按需选择即可。
内容的提问来源于stack exchange,提问作者philolegein
相关产品推荐
相关产品推荐

