【问题标题】:Sails.js lazy loading modelsSails.js 延迟加载模型
【发布时间】:2018-03-04 17:34:28
【问题描述】:

假设我有一个问题模型,其中包含许多要回答的选项,基本上是一个问题对多个选项。 Sails 自动为问题和选择模型公开一个 RESTful 列表视图,但每个端点也会自动列出所有关联关系,如下所示:

致电GET /question:

{
  "choices": [
    {
      "createdAt": 1520183091725,
      "updatedAt": 1520183091725,
      "id": 1,
      "text": "This is an answer",
      "votes": 1,
      "associatedQuestion": 1
    }
  ],
  "createdAt": 1520183061263,
  "updatedAt": 1520183061263,
  "id": 1,
  "text": "This is a question"
}

这一切都很好,直到我的 choice 模型自己获得新关系,因此再次嵌套列表。

有没有办法告诉 Sails 哪些属性不应该在默认 REST 路由中发送?我想我可以在我的QuestionController 上创建一个使用find 的方法,然后它只会返回question 对象的平面列表。但这是一个好习惯吗?

【问题讨论】:

  • 是的,根据我的经验,路线只能让你走这么远。对于其他一切,创建自己的控制器是必经之路。
  • 那么您是否建议不要在生产中启用蓝图,因为它们不支持分页并且响应可能会变得低效大?
  • 是和否,使用风帆,您可以在每个控制器的基础上停用蓝图路线。就像我对某些请求所说的那样,唯一的方法是使用您自己的控制器功能。使用蓝图,您可以分页、使用限制和跳过。
  • 我可以强制蓝图在每个控制器的基础上进行限制或分页,以便每个请求默认只返回 x 个结果吗?感谢您的输入
  • 您可以在 config/blueprints.js 中使用 defaultLimit : 20 为所有蓝图设置限制,也可以在 config/routes.js 中使用 "GET /model": {blueprint: populate_limit: 20} 为单个路由设置限制

标签: javascript node.js sails.js lazy-loading


【解决方案1】:

如 cmets 中所述;对于数据集/数据库上更复杂的查询,在控制器中创建一个动作很有意义。动作与应用程序中的路由绑定,因此当客户端请求路由时,会执行动作以执行一些业务逻辑并发送响应。

关于您的担忧:

在我选择的模型本身获得新的关系之前,一切都很好, 因此再次嵌套列表。

如果您使用的是 Sails 版本

如果您使用的是 Sails >= v1.您可以创建自己的控制器操作来限制这一点。依赖于数据库,这可以使用 Waterline 查询语言来完成,或者如果使用 RDMS,.native()/.query() 方法直接调用底层数据库驱动程序。例如,使用 MySQL:

Question.query("SELECT * " +
    "FROM   question " +
    "      JOIN choices " +
    "        ON question.id = choices.id " +
    "WHERE  question.id = "+req.param('id')+"; ").exec...

离题但与我们在 cmets 中的讨论相关。

要限制从路由或动作控制器返回的结果数量,您可以:

在 config/blueprints.js 中设置全局 defaultLimit

defaultLimit: 20

在 config/routes.js 中逐个路由设置限制

"GET /question": {blueprint: populate_limit: 20}

或者使用请求中的url参数

"&limit=10"

【讨论】:

  • 再次感谢。我目前使用的是 1.0-beta 版本,因为它是最终的候选版本。您为路由提供的语法不正确,您能提供正确的语法吗?我猜你想将 populate_limit: 20 嵌套在另一个对象中,但这在 1.0 中仍然对我不起作用。
  • 现在next.sailsjs.com/documentation/reference/configuration/… 似乎已经涵盖了它。向下滚动到使用 parseBlueprintOptions 部分以获取有关设置限制的示例。
猜你喜欢
  • 2012-03-12
  • 1970-01-01
  • 2018-05-22
  • 2019-12-16
  • 2014-01-15
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
  • 2019-07-15
相关资源
最近更新 更多