Node/Hapi.js - 如何通过 hapi.js 从数据库中 stream/append 结果集?
Node/Hapi.js - How to stream/append result set from database via hapi.js?
我正在尝试创建 REST 服务,该服务 returns 来自数据库的数据作为通过 hapi.js 的响应。
我正在使用 tedious 来执行 SQL 查询,我想将结果格式化为 JSON 或 XML 和 return 它们作为 hapi 请求的响应。请注意,这不是特定于乏味的,我可能对任何数据库都有同样的问题。
Tedious 有一个回调,每次从结果集中接收到新行时都会调用该回调:
sqlRequest.on('row', function (columns) {
fnOutput(columns[0].value);
});
这是最简单的一列输出示例。 fnOutput 是一个自定义函数,它接受应该 returned 的文本。它可以连接结果并将它们格式化为 JSON,将 returned 给客户端。
我正在逐行获取,我想连接行中的值,然后 return 通过 hapi 将它们发送给客户端。
如何连续发送部分结果到响应?
- 我不想连接此回调中的所有行,然后在查询完成时推送整个格式化 JSON。我不知道我会有多少条记录,我想避免会累积的大字符串。
- 如果我每次获取新行时尝试在 fnOutput 中调用 reply(columns[0].value),当第二行 returned 时失败:
"reply interface called twice"
每次我在回调函数中获得新行时,是否有某种方法可以将此回调中的结果连续附加到 hapi.js 输出流?
您可以使用 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();
});
我正在尝试创建 REST 服务,该服务 returns 来自数据库的数据作为通过 hapi.js 的响应。
我正在使用 tedious 来执行 SQL 查询,我想将结果格式化为 JSON 或 XML 和 return 它们作为 hapi 请求的响应。请注意,这不是特定于乏味的,我可能对任何数据库都有同样的问题。 Tedious 有一个回调,每次从结果集中接收到新行时都会调用该回调:
sqlRequest.on('row', function (columns) {
fnOutput(columns[0].value);
});
这是最简单的一列输出示例。 fnOutput 是一个自定义函数,它接受应该 returned 的文本。它可以连接结果并将它们格式化为 JSON,将 returned 给客户端。
我正在逐行获取,我想连接行中的值,然后 return 通过 hapi 将它们发送给客户端。 如何连续发送部分结果到响应?
- 我不想连接此回调中的所有行,然后在查询完成时推送整个格式化 JSON。我不知道我会有多少条记录,我想避免会累积的大字符串。
- 如果我每次获取新行时尝试在 fnOutput 中调用 reply(columns[0].value),当第二行 returned 时失败: "reply interface called twice"
每次我在回调函数中获得新行时,是否有某种方法可以将此回调中的结果连续附加到 hapi.js 输出流?
您可以使用 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()
类似的东西(未经测试):
sqlRequest.on('row', function (columns) {
request.raw.res.write(columns[0].value);
});
sqlRequest.on('done', function () {
reply.continue();
});