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

如何在Strapi中从自定义GraphQL resolver调用原始注册resolver

如何在自定义GraphQL Resolver中调用Strapi Upload插件的原始removeFile Resolver?

我已经通过插件的register.js文件成功替换了Upload核心插件removeFile mutation的GraphQL resolver,但不知道如何在自定义resolver中调用原始的removeFile resolver,现有代码如下:

export default ({ strapi }) => {
  const extensionService = strapi.plugin("graphql").service("extension");

  extensionService.use(({ nexus }) => ({
    resolvers: {
      Mutation: {
        removeFile: async (obj, args) => {
          // 我的自定义逻辑将写在这里

          // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
          // 我想在这里调用"removeFile"的原始resolver
          // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

          // 其他逻辑也会写在这里
        },
      },
    },
  }));
};

我的问题是: 如何从新注册的自定义GraphQL resolver中调用已注册的removeFile mutation原始resolver?


补充信息

我已经成功替换了控制器的处理函数,并能在合适时机调用旧函数,代码如下:

export default ({ strapi }) => {
  strapi.container
    .get("controllers")
    .extend("plugin::upload.admin-file", (controller) => {
      const originalHandler = controller["destroy"].bind(controller);

      controller["destroy"] = async function (ctx) {
        // 我的自定义逻辑将写在这里

        await originalHandler();

        // 其他逻辑也会写在这里
      };

      return controller;
    });
};

解决方案

方法1:直接获取并调用原始Resolver

你可以通过Strapi的服务实例直接获取Upload插件的原始GraphQL resolver,然后在自定义逻辑中调用它:

export default ({ strapi }) => {
  const extensionService = strapi.plugin("graphql").service("extension");
  // 获取Upload插件的原始removeFile resolver
  const originalRemoveFileResolver = strapi.plugin('upload').service('graphql').resolvers.Mutation.removeFile;

  extensionService.use(({ nexus }) => ({
    resolvers: {
      Mutation: {
        removeFile: async (obj, args, context, info) => {
          // 执行自定义前置逻辑
          // 比如记录日志、校验权限等

          // 调用原始resolver,务必传递所有参数(obj、args、context、info)
          const result = await originalRemoveFileResolver(obj, args, context, info);

          // 执行自定义后置逻辑
          // 比如更新关联数据、发送通知等

          return result;
        },
      },
    },
  }));
};

方法2:使用Strapi的wrapResolver工具

Strapi的GraphQL扩展服务提供了wrapResolver方法,可更优雅地包装原始resolver:

export default ({ strapi }) => {
  const extensionService = strapi.plugin("graphql").service("extension");

  extensionService.use(({ wrapResolver }) => ({
    resolvers: {
      Mutation: {
        removeFile: wrapResolver((next) => async (obj, args, context, info) => {
          // 自定义前置逻辑
          console.log("删除文件前的自定义操作");

          // 调用原始resolver
          const result = await next(obj, args, context, info);

          // 自定义后置逻辑
          console.log("删除文件后的自定义操作");

          return result;
        }),
      },
    },
  }));
};

两种方法都能在保留原始功能的同时添加自定义逻辑,注意调用原始resolver时必须传递完整参数(obj、args、context、info),否则可能导致功能异常。

内容的提问来源于stack exchange,提问作者Amjed Omar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 03:54:15