使用Sails 0.12+Waterline ORM报错:Trying to access a collection string that is not defined
嘿,这个错误我之前在Sails 0.12里踩过坑!本质问题是Waterline找不到你模型里引用的关联对象,大概率是下面几个原因之一,咱们一步步来排查:
1. 先确认关联的模型文件确实存在
首先去你的api/models/目录下看看,有没有manufacturer_tabs.js(或者大驼峰命名的ManufacturerTabs.js)和brands.js(Brands.js)这两个模型文件。如果没有,先创建它们——Waterline不可能关联一个根本不存在的模型。
2. 检查关联类型是否用错了
看你的模型代码,你用了model: 'manufacturer_tabs'和model: 'brands'——model是用来定义一对一关联的,但从字段名来看,一个制造商应该对应多个标签/多个品牌,这时候你需要用collection来定义一对多关联,同时要配合via指定反向关联的字段:
修正后的当前模型(假设是Manufacturer.js)代码:
module.exports = { attributes: { manufacturer_name: { type: 'string' }, manufacturer_logo_url: { type: 'string' }, manufacturer_archived_status: { type: 'boolean' }, // 一对多:一个制造商对应多个tabs manufacturer_tabs: { collection: 'manufacturer_tabs', via: 'manufacturer' }, // 一对多:一个制造商对应多个品牌 brands: { collection: 'brands', via: 'manufacturer' } } };
然后在对应的关联模型里,要定义反向关联的字段:
比如ManufacturerTabs.js:
module.exports = { attributes: { // 这里可以加你的tab字段,比如tab_name: { type: 'string' } manufacturer: { model: 'manufacturer' } // 指向制造商模型 } };
Brands.js同理:
module.exports = { attributes: { // 比如brand_name: { type: 'string' } manufacturer: { model: 'manufacturer' } } };
3. 检查模型的identity是否匹配
如果你在某个模型里手动指定了identity属性(比如identity: 'manuTabs'),那关联时必须用这个identity的值,而不是文件名。比如如果ManufacturerTabs.js里写了:
module.exports = { identity: 'manuTabs', attributes: { ... } }
那你当前模型里的关联就得改成collection: 'manuTabs',否则Waterline会找不到。
4. 重启Sails服务
有时候你刚创建完关联模型,旧的sails lift进程还没加载新模型,关掉进程重新执行sudo sails lift试试。
按照上面的步骤排查,应该就能解决这个错误了!
内容的提问来源于stack exchange,提问作者Rahul Dagli

