Sails.js延迟加载模型

时间:2018-03-04 17:34:29

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

让我们说我有一个包含许多选择的问题模型,基本上是一个问题到多个选择。 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个对象的平面列表。但这是一个好习惯吗?

1 个答案:

答案 0 :(得分:1)

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

关于您的疑虑:

  

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

如果您使用的是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

defaultLimit: 20

在config / routes.js

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

或使用请求中的url参数

"&limit=10"