【问题标题】:Node.js Rendering big amount of JSON data from the serverNode.js 从服务器渲染大量 JSON 数据
【发布时间】:2013-11-16 12:40:43
【问题描述】:

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

当我运行它时,服务器抛出内存不足异常。

我想添加一个无限滚动功能,这样我就不必一次加载所有数据。

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

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

我使用带有 express 和 ejs 的 node.js 作为模板引擎。 我愿意使用任何可以帮助我完成整个过程的框架(特别是检查 Angualr.js)。

谢谢

【问题讨论】:

  • 数据究竟存储在哪里? sql数据库?蒙哥?如果是 mongo - 检查stackoverflow.com/questions/5049992/mongodb-paging
  • @Murukesh 数据取自 Mongodb,但我不使用分页,而是加载到内存中。当我尝试使用数据渲染视图时出现问题,然后它会耗尽内存。我猜render 是一个内存昂贵的操作,因此它会崩溃。有没有办法将数据以 JSON 格式分块传输到浏览器?不想过多改动实现,添加mongodb分页
  • 恕我直言,如果您不在服务器上使用分页,那么在客户端上使用无限滚动是没有意义的。你必须先解决这个问题。
  • @KosProv 我想在服务器上使用分页,我只是想知道是否有办法在 http 级别进行分页而不是从 mongodb 进行分页
  • 我认为这样会浪费资源(数据中心网络/CPU/内存/IO)。另外,这不会很好地扩展。如果您的数据集增长到数百万行怎么办?它不适合您的 Web 层的内存。而且 - 底线 - 您的用户只会看到所有这些工作的一小部分。

标签: json node.js angularjs express infinite-scroll


【解决方案1】:

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

然后,您必须将后端查询更改为如下所示:

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

这实际上告诉您的服务器在给定时间戳之前获取创建/发布/更改/whatever 的项目,并仅返回其中的 50 个。这意味着您的后端实体(例如博客条目、产品等)需要在 连续空间 中缺少自然排序(发布日期时间戳几乎是连续的)。这非常重要,因为即使您使用时间戳,您最终也可能会出现极端的 heisenbugs,其中项目被渲染两次(如果您使用

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

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

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

另一种方法是简单地发送最后一项的 id,例如:

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

让服务器决定做什么。我想你可以使用像 Redis 这样的 NoSQL 存储来非常快速地回答这种查询并且没有副作用。

这是一般的想法。希望对你有帮助。

【讨论】:

  • 谢谢。我试图避免更改对我的数据库层的访问,并以某种方式在res.send() 阶段进行分页。但由于调用是异步的,我必须在客户端和服务器之间保持开放连接,我不知道这是否可能。
  • 为什么需要开放连接?
  • 假设我有一个大的 JSON 数据对象,然后我想将它发送到我的视图。我希望能够从视图调用getMoreData(),这将获得另一块数据。我该怎么做?
  • 您不需要打开的连接。 Angular 通过一个 HTTP 调用请求第一批。该呼叫结束,连接最终关闭。当用户滚动到页面末尾时,第二个完全独立的 HTTP 调用会请求第二个补丁。如果您有服务器端推送等,您将需要一个开放的连接,但我认为情况并非如此。
猜你喜欢
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 2017-10-28
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
相关资源
最近更新 更多