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

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

相关产品推荐
方舟 Agent Plan

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

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