Sails.js 0.12 全局模型自定义方法问题:无法获取调用模型名称
解决Sails 0.12全局模型方法中获取模型名称的问题
嘿,我刚好对Sails 0.12的模型上下文这块熟,给你捋清楚怎么解决这个问题~
你遇到的核心问题是全局模型方法的this上下文和你参考的seed方法不一样:
- 那个seed方法是直接以模型构造函数为上下文调用的(比如
User.seed()),所以this指向模型构造函数,自带adapter属性; - 而你在
config/models.js里定义的secureUpdate是挂载到所有模型原型上的实例方法,调用时this指向模型实例,实例上下文里没有adapter,但有更直接的方式获取模型名称。
两种靠谱的解决方案
方案一:直接用原型上的identity属性
Sails 0.12的每个模型原型都自带identity属性,就是模型的小写标识(比如用户模型是user),直接拿过来转首字母大写就行:
secureUpdate: function() { // 获取模型的小写标识 const modelIdentity = this.identity; // 转成首字母大写的模型名称 const modelName = modelIdentity.charAt(0).toUpperCase() + modelIdentity.slice(1); console.log('当前调用的模型名称:', modelName); // 你的批量赋值逻辑写在这里... }
方案二:通过constructor获取模型构造函数(更严谨)
如果担心原型属性被覆盖,你可以通过this.constructor拿到当前实例所属的模型构造函数,构造函数上自带globalId属性(Sails自动生成的首字母大写模型名,比如User),不用手动转换:
secureUpdate: function() { // 获取当前实例的模型构造函数 const Model = this.constructor; // 直接拿到首字母大写的模型名称 const modelName = Model.globalId; console.log('当前调用的模型名称:', modelName); // 你的批量赋值逻辑写在这里... }
额外说明
如果你是想在类方法(不是实例方法)里实现这个功能,那可以把secureUpdate定义成模型的静态方法,比如在单个模型文件里写:
module.exports = { attributes: {}, // 静态类方法,this指向模型构造函数 secureUpdate: function() { const modelName = this.globalId; console.log('当前模型名称:', modelName); } };
这种情况下this就和你参考的seed方法一样,能拿到adapter属性,但全局定义的话还是用前面两种方案更方便。
内容的提问来源于stack exchange,提问作者Duc Anh
相关产品推荐
相关产品推荐

