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

如何让模块函数同时访问多个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 02:15:02