node.js - Sails 0.10 关联无法填充

标签 node.js sails.js waterline

我正在 sails@0.10.0-rc4 中开发一个自定义适配器,它将支持关联,但我无法让它们与我的适配器一起工作。我的配置是文章和统计之间的一对多关联。我的模型和适配器设置如下:

// api/models/article.js
module.exports = {
  connection: ['myadapter'],
  tableName: 'Knowledge_Base__kav',
  attributes: {
    KnowledgeArticleId: { type: 'string', primaryKey: true }
    stats: {
      collection: 'stats',
      via: 'parentId'
    } 
  }

// api/models/stats.js
module.exports = {
  connection: ['myadapter'],
  tableName: 'KnowledgeArticleViewStat',
  attributes: {
    count: 'integer',
    ParentId: {
      model: 'article'
    }
  }
}


// adapter.js  
find: function(connectionName, collectionName, options, cb) {  
  console.dir(options)
  // output
  // {where: null} 
  db.query(options, function(err, res)) {
    cb(err, res)
  }
}

但是,当我尝试使用 Article.find().populate('stats').exec(console.log()) 填充时,我的适配器得到 {where: null}当我希望它收到 {where: {parentId: [<some-article-id>]}} 时作为选项.它向我返回一个文章列表,但应该从另一个模型(统计数据)填充的字段只是一个空列表。

我觉得这与我的适配器没有获取正确的 where 参数来搜索主键上的相关模型这一事实有关。为了进一步测试这一点,我使用 sails-mongo 适配器设置了一个测试一对多关系。在这种情况下,适配器确实收到了我预期的参数并且关联工作正常。

有谁知道为什么 .populate('stats')不会向我的适配器发送正确的“where”参数吗?

更新 3/7

所以看起来在关联中发生的事情是 SomeModel.find() 将命中适配器一次,然后 .populate('othermodel') 使用第一个请求的主键再次命中适配器。然后将两者的结果结合在一起。在我的例子中,由于某些未知原因没有发生对适配器的第二次攻击。

更新

最初的问题与下面评论中提到的属性命名错误有关。然而,particlebanana 提到的最终填充步骤似乎仍然存在一些问题。 :

Final step will: Take all of the query results from all the returned query operations and combine them in-memory to build up a result set you can return in the exec callback.

我看到所有必需的查询现在都在触发,但它们无法实际填充别名。这是调用,以要点的形式添加了一些调试输出以便于使用:https://gist.github.com/jasonsims/9423170

最佳答案

看来您的方向是正确的!操作集的构建方式是,文章中的 .find() 应该使用第一个日志(空位置)运行,第二个查询应该使用日志中的 parentId 条件运行。第二个查询未运行,因为当您不从第一个查询返回任何内容时,它无法构建 parentId 主键数组。

简短回答:您需要在 find 回调中返回一些内容以查看第二个日志,这应该符合您的预期标准。

查询生命周期看起来像这样:

  • 检查所有查询片段是否都在同一个连接上,如果不断开,哪些查询将在哪些连接上运行
  • 对于单个连接上的所有查询,检查适配器是否支持 native 连接(具有 .join() 方法,如果支持,您可以向下传递条件并让适配器处理连接。
  • 如果未定义 native 连接方法,则运行“父级”操作(在本例中为 Article.find())
  • 使用父级操作的结果为需要运行的任何群体建立标准。 (您条件中的 parentId 数组)并运行子结果。
  • 从所有返回的查询操作中获取所有查询结果,并在内存中组合它们以构建一个结果集,您可以在 exec 回调中返回。

希望对大家有所帮助。把你的 repo 的 url 发给我,我会仔细查看它是否可以开源,如果你遇到任何问题,我可以提供更多帮助。

关于node.js - Sails 0.10 关联无法填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22258291/

相关文章:

node.js - Azure 虚拟机上的 Sails.js 部署问题

node.js - 如何在 Sails.js 中使用 Waterline 运行自定义查询?

node.js - 如何处理循环中的 promise ?

node.js - sails.js 水线模型不工作

javascript - 使用 SailsJS + AngularJS 时如何防止模板暴露

node.js - 请在node.js中验证我在Redis,Socke.io上的方法

node.js - Mongoose find() 返回一个空文档

mysql - 如何查找未与 Waterline ORM 连接的记录

node.js - 不正确的标题检查错误

node.js - ESLint 同时输出到文件和控制台