Sails v1.0未加载api/blueprints目录,如何全局覆盖蓝图动作?
解决Sails v1.0全局覆盖蓝图动作的问题
嘿,这个问题我太熟悉了!Sails v1.0对蓝图系统做了不小的重构,原来api/blueprints目录的玩法确实已经失效了——不过别担心,有两种非常靠谱的方式能实现全局覆盖所有控制器的蓝图动作:
方法一:扩展默认控制器基类(灵活可控)
这种方式通过创建一个基础控制器类,让所有业务控制器继承它,从而批量覆盖蓝图动作,适合需要分场景调整的情况:
创建基类控制器
在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)同理添加 };让业务控制器继承基类
修改你的业务控制器(比如UserController.js、OrderController.js),继承这个基类:// 引入基类 const _BaseController = require('./_BaseController'); // 用merge合并基类和当前控制器的自定义逻辑 module.exports = _.merge({}, _BaseController, { // 这里可以写当前控制器特有的动作,或者单独重写基类方法(优先级更高) // 比如只给UserController单独定制find动作: // find: async function(req, res) { ... } });
方法二:自定义蓝图钩子(全自动全局覆盖)
如果不想逐个修改控制器,想让所有蓝图动作默认应用你的自定义逻辑,用自定义钩子是最省心的方式:
创建自定义钩子
在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等)都可以用这个模式覆盖 } }; };启动Sails自动加载钩子
不需要额外配置,Sails会自动扫描api/hooks目录并加载这个钩子,重启服务后所有蓝图动作都会应用你的自定义逻辑。
补充说明
如果只是需要覆盖单个模型的蓝图动作,直接在对应控制器里重写方法即可,比如UserController.js里定义find方法,就会单独覆盖User模型的蓝图find动作,这个逻辑和v0.12是一致的。
内容的提问来源于stack exchange,提问作者WalksAway
相关产品推荐
相关产品推荐

