Sails.js 延迟加载模型

Sails.js lazy loading models

假设我有一个问题模型,其中包含许多要回答的选项,基本上是一个问题到多个选项。 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 的方法,然后它只会 return 一个 question 对象的平面列表。但这是一个好习惯吗?

如评论中所述;对于 dataset/database 上更复杂的查询,在控制器中创建一个操作很有意义。动作绑定到应用程序中的路由,以便当客户端请求路由时,执行动作以执行一些业务逻辑并发送响应。

关于您的顾虑:

That's all fine until my choice model gets new relations itself, therefore nesting the list again.

如果您使用的 Sails 版本 < v1. 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...

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

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

在config/blueprints.js

中设置全局默认限制
defaultLimit: 20

在config/routes.js

中逐个路由设置限制
"GET /question": {blueprint: populate_limit: 20}

或者在请求中使用url参数

"&limit=10"