Node.js从服务器渲染大量的JSON数据

我有一个视图有一个for循环插入行到表。 桌子很大,已经有几千行了。

当我运行它时,服务器抛出内存exception。

我想添加一个无限的滚动function,所以我不会一次加载所有的数据。

现在数据正在用常规的res.render(index.ejs, data)data是JSON)

我可以找出无限的滚动部分,但是如何从服务器获取块的JSON数据?

我用express和ejs作为模板引擎使用node.js。 我愿意使用任何框架来帮助我完成整个过程(尤其是检查Angualr.js)。

谢谢

首先,无限滚动有一个angular度分量: http : //ngmodules.org/modules/ngInfiniteScroll

然后,你必须改变你后端查询看起来像这样:

 http://my.domain.com/items?before=1392382383&count=50 

这实际上告诉你的服务器获取创build/发布/更改/给定的时间戳之前的任何项目 ,并只返回其中的50个。 这意味着您的后端实体(无论是博客条目,产品等)需要在连续的空间中进行一些自然sorting(发布date时间戳几乎是连续的)。 这是非常重要的,因为即使你使用时间戳,你也可能会因为极端的heisenbugs而导致项目被渲染两次(如果你使用<=那是definate),松散的项目(如果你在项目的边缘使用<你的结果集在相同的时间戳上),甚至一次又一次地载入相同的项目(在相同的时间戳上超过50个项目)。 您必须通过过滤重复项目来处理这种情况。

您的服务器端代码将其转换为查询(如当然的DB2 SQL):

 SELECT * FROM ITEMS WHERE PUBLICATION_DATE <= 1392382383 ORDER BY PUBLICATION_DATE DESC FETCH FIRST 50 ROWS ONLY 

当无限滚动到达页面的末尾并调用你的注册callback时,通过考虑已经加载的项目的最后一项来创build这个$http.get请求。 对于第一个查询,您可以使用当前的时间戳。

另一种方法是简单地发送最后一个项目的ID,如:

 http://my.domain.com/items?after_item=1232&count=50 

并让服务器决定要做什么。 我想你可以像Redis一样使用NoSQL存储来快速回应这种查询,而且没有副作用。

这是一般的想法。 我希望它有帮助。