【问题标题】:Sails workaround for deep populate用于深度填充的 Sails 解决方法
【发布时间】:2016-08-09 02:39:51
【问题描述】:

我正在尝试深度填充集合。

例如

// UnitType.js
name: { type: 'string' }

// Unit.js
unitType: {
  model: 'unitType',
  via: '_id',
  required: true,
  index: true
}

// Product.js
unit: {
  model: 'unit',
  via: '_id',
  required: true,
  index: true
},

问题是,据我所知,我从互联网研究中了解到,像

Product.find().populate('unit.unitType');

目前在 Sails 中不受支持。为了达到我目前想要的结果

  • 查询产品填充unit
  • 使用 `product.unit.unitType`` 的 id 查询 UnitTypes
  • .map() product.unit.unitType 回复

这当然远非理想。我还尝试在模型中使用toJSON 来“预填充”unitType -> 不起作用,因为它不支持 Promises。

关于这个问题,so 和 PR 在 github 上有很多线程,但到目前为止我还没有找到解决这个问题的方法。有什么办法可以改善吗?

【问题讨论】:

  • 如果您在工作流程中使用 async/await 或生成器(可能没有),您可以使用我的 gist(将其编译为 js)并将其合并到您的模型中,不过它只是一个 WIP.. .gist.github.com/Zaggen/7de61775ed083d10c07e

标签: node.js sails.js populate


【解决方案1】:

您可以尝试将Waterline ORM 替换为Offshore ORM。帆有一个钩子可以做到这一点 - sails-hook-orm-offshore

它很容易在您现有的项目中实施,因为它的 Waterline 分支具有更多功能。我发现的唯一缺点是sails-hook-validation 停止工作。

如何安装

npm install sails-hook-orm-offshore --save

配置

.sailsrc

{
    "hooks": {
        "orm": false,
        "pubsub": false
    }
}

默认值

config/globals.js

adapters: true,
models: true

用法

现在您可以在查询中使用deep populate。例如(来自文档):

User.find()
.populate('foo.bar', { name: 'foo' }) //populate foo into user and bar into foo
.exec(function(err, users) {
    console.log(users[0].foo.bar.name) // 'foo'
});

第二个选项

用水线合并深层填充

npm i Atlantis-Software/waterline#deepPopulate

【讨论】:

  • 感谢您的评论,但不幸的是它没有按预期工作(如果整个项目都搞砸了,这会导致我的整个项目都无法正常工作)。我想我必须坚持我目前的解决方案,直到风帆/水线实现深度填充
  • 所以也许只是自己将深度填充与水线合并。从我的解决方案中卸载该钩子并执行: npm i Atlantis-Software/waterline#deepPopulate (即合并请求水线)
  • 会很好,但是错误(超时)还是一样
  • 获取数据超时?您是否尝试过从节点 cli 执行模型方法?也许您正试图一次获取太多数据。
  • 我对超时不好,实际错误是Error: Encountered unexpected error while building join instructions for .populate(\"unit.unitType\") 模型的定义就像我上面写的那样 -> 单元肯定有一个单元类型
猜你喜欢
  • 2015-10-12
  • 1970-01-01
  • 2018-12-03
  • 2018-12-12
  • 2017-04-08
  • 2010-11-15
  • 2014-04-11
  • 2017-01-17
  • 2015-07-12
相关资源
最近更新 更多