Javascript Sails.js延迟加载模型

Javascript Sails.js延迟加载模型,javascript,node.js,sails.js,lazy-loading,Javascript,Node.js,Sails.js,Lazy Loading,假设我有一个问题模型,它包含了很多选择,基本上是一个一对多的问题。 Sails会自动为问题和选择模型公开一个RESTful列表视图,但每个端点也会自动列出所有关联关系,如下所示: 调用GET/question: { "choices": [ { "createdAt": 1520183091725, "updatedAt": 1520183091725, "id": 1, "text": "This is an answer",

假设我有一个问题模型,它包含了很多选择,基本上是一个一对多的问题。 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"
}
在我的
选择
模型本身获得新的关系之前,这一切都很好,因此再次嵌套列表


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

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

关于你的关切:

这一切都很好,直到我的选择模式本身有了新的关系, 因此,再次嵌套列表

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

是的,根据我的经验,路线只能让你走这么远。对于其他方面,创建自己的控制器是一种方法。因此,您是否建议不要在生产中启用蓝图,因为它们不支持分页,并且响应可能会低效率地变大?是和否,使用sails,您可以根据每个控制器停用蓝图路由。就像我对一些请求所说的,唯一的方法是使用您自己的控制器功能。对于蓝图,您可以分页、使用限制和跳过。我可以强制蓝图对每个控制器进行限制或分页,以便每个请求在默认情况下只返回x个结果吗?感谢您的输入您可以使用config/blueprints.js中的
defaultLimit:20
为所有蓝图设置限制,或者使用config/routes.js中的
“GET/model”:{blueprint:populate\u limit:20}
为单个路由设置限制再次感谢。我目前正在使用1.0-beta版,因为它是最终的候选版本。不过,您为路由提供的语法不正确,您能提供正确的语法吗?我猜您想在另一个对象中嵌套populate_limit:20,但这在1.0中对我仍然不起作用。看起来它现在已经被覆盖了。向下滚动到使用parseBlueprintOptions部分,以获取有关设置限制的示例。