如何在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
相关产品推荐
相关产品推荐

