【问题标题】:Node/Hapi.js - How to stream/append result set from database via hapi.js?Node/Hapi.js - 如何通过 hapi.js 从数据库中流式传输/追加结果集?
【发布时间】:2016-04-21 08:31:52
【问题描述】:

我正在尝试创建 REST 服务,该服务通过 hapi.js 从数据库返回数据作为响应。

我使用繁琐的方式执行 SQL 查询,我想将结果格式化为 JSON 或 XML,并将它们作为 hapi 请求的响应返回。请注意,这不是单调乏味的,我可以在任何数据库中遇到相同的问题。 Tedious 有一个回调,每次从结果集中接收到新行时都会调用它:

sqlRequest.on('row', function (columns) {
        fnOutput(columns[0].value);
});

这是最简单的一列输出示例。 fnOutput 是一个自定义函数,它接受应该返回的文本。它可以连接结果并将它们格式化为将返回给客户端的 JSON。

我正在逐行获取,我想将行中的值连接起来,然后通过 hapi 将它们返回给客户端。 如何将部分结果连续发送到响应中?

  1. 我不想连接此回调中的所有行,然后在查询完成时推送整个格式化的 JSON。我不知道我将拥有多少条记录,并且我想避免累积的大字符串。
  2. 如果我每次获取新行时都尝试在 fnOutput 中调用 reply(columns[0].value),则在返回第二行时会失败: “回复界面调用了两次”

每次我在回调函数中获得新行时,是否有某种方法可以将此回调中的结果连续附加到 hapi.js 输出流?

【问题讨论】:

  • 什么版本的hapi?
  • 最新版本^12.1.0
  • 您使用的数据库驱动程序是否支持流式传输结果?
  • tedious 是基于事件的,因此每次收到新行时都会运行回调。我发现了一些支持流式传输的请求,但似乎没有实现。
  • 我相信我正在寻找类似 response.write 来自 express stackoverflow.com/questions/18857693/… 的方法。 hapijs 中是否有等价物或类似的东西。

标签: node.js hapijs tedious


【解决方案1】:

您可以使用request.raw.res.write() 将数据写入原始响应

request.raw.res 是原始的 ServerResponse 对象,您可以在此处找到write 方法的文档:https://nodejs.org/dist/latest-v4.x/docs/api/http.html#http_response_write_chunk_encoding_callback

完成数据写入后,您需要通过调用 reply.close() 来告诉 hapi 您已完成手动处理请求

类似的东西(未经测试):

sqlRequest.on('row', function (columns) {
    request.raw.res.write(columns[0].value);
});

sqlRequest.on('done', function () {
    reply.continue();
});

【讨论】:

  • 你是对的,这解决了问题。我使用 request.raw.res.end() 而不是 reply.continue() 因为我已将整个 reply.raw.res 对象传递给我的函数。如果效果很好。
猜你喜欢
  • 1970-01-01
  • 2019-10-29
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 2018-03-30
  • 2017-07-27
相关资源
最近更新 更多