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

Sails v1.0未加载api/blueprints目录,如何全局覆盖蓝图动作?

解决Sails v1.0全局覆盖蓝图动作的问题

嘿,这个问题我太熟悉了!Sails v1.0对蓝图系统做了不小的重构,原来api/blueprints目录的玩法确实已经失效了——不过别担心,有两种非常靠谱的方式能实现全局覆盖所有控制器的蓝图动作:

方法一:扩展默认控制器基类(灵活可控)

这种方式通过创建一个基础控制器类,让所有业务控制器继承它,从而批量覆盖蓝图动作,适合需要分场景调整的情况:

  1. 创建基类控制器
    在api/controllers目录下新建_BaseController.js(下划线开头是约定,表示这是基类,不会被自动注册路由):

    module.exports = {
      // 重写全局find蓝图动作
      find: async function(req, res) {
        // 这里写你的自定义逻辑,比如权限校验、日志记录
        console.log('全局自定义find动作触发');
        // 如果需要保留原蓝图的核心逻辑,直接调用内置的蓝图中间件
        return await sails.hooks.blueprints.middleware.find(req, res);
      },
    
      // 重写全局add蓝图动作
      add: async function(req, res) {
        console.log('全局自定义add动作触发');
        // 自定义逻辑示例:校验请求参数
        if (!req.param('targetId')) {
          return res.badRequest('缺少targetId参数');
        }
        // 调用原蓝图逻辑
        return await sails.hooks.blueprints.middleware.add(req, res);
      }
      // 其他需要覆盖的蓝图动作(如update、destroy、populate)同理添加
    };
    
  2. 让业务控制器继承基类
    修改你的业务控制器(比如UserController.js、OrderController.js),继承这个基类:

    // 引入基类
    const _BaseController = require('./_BaseController');
    // 用merge合并基类和当前控制器的自定义逻辑
    module.exports = _.merge({}, _BaseController, {
      // 这里可以写当前控制器特有的动作,或者单独重写基类方法(优先级更高)
      // 比如只给UserController单独定制find动作:
      // find: async function(req, res) { ... }
    });
    

方法二:自定义蓝图钩子(全自动全局覆盖)

如果不想逐个修改控制器,想让所有蓝图动作默认应用你的自定义逻辑,用自定义钩子是最省心的方式:

  1. 创建自定义钩子
    在api/hooks目录下新建custom-blueprints文件夹,里面创建index.js:

    module.exports = function defineCustomBlueprintsHook(sails) {
      return {
        // 钩子初始化时执行
        initialize: async function() {
          // 覆盖find蓝图动作
          const originalFindMiddleware = sails.hooks.blueprints.middleware.find;
          sails.hooks.blueprints.middleware.find = async function(req, res) {
            // 全局自定义逻辑,比如统一的日志上报
            sails.log.info(`[全局蓝图] 执行find动作,模型:${req.options.model}`);
            // 调用原蓝图逻辑
            return await originalFindMiddleware(req, res);
          };
    
          // 覆盖add蓝图动作
          const originalAddMiddleware = sails.hooks.blueprints.middleware.add;
          sails.hooks.blueprints.middleware.add = async function(req, res) {
            sails.log.info(`[全局蓝图] 执行add动作,模型:${req.options.model}`);
            // 自定义逻辑示例:记录关联操作日志
            await Log.create({
              action: 'add_association',
              model: req.options.model,
              userId: req.session.userId
            });
            return await originalAddMiddleware(req, res);
          };
    
          // 其他蓝图动作(update、destroy等)都可以用这个模式覆盖
        }
      };
    };
    
  2. 启动Sails自动加载钩子
    不需要额外配置,Sails会自动扫描api/hooks目录并加载这个钩子,重启服务后所有蓝图动作都会应用你的自定义逻辑。

补充说明

如果只是需要覆盖单个模型的蓝图动作,直接在对应控制器里重写方法即可,比如UserController.js里定义find方法,就会单独覆盖User模型的蓝图find动作,这个逻辑和v0.12是一致的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:57:07