Node / Hapi.js - 如何通过hapi.js从数据库中流式传输/追加结果集?

时间:2016-01-15 17:10:39

标签: node.js hapijs tedious

我正在尝试创建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),则在返回第二行时失败: “回复界面叫两次”
  3. 每次在回调函数中获取新行时,是否有某种方法可以在此回调中将结果连续追加到hapi.js输出流?

1 个答案:

答案 0 :(得分: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

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

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

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

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