刚开始调查从一台服务器到另一台服务器的流数据。我使用REQUEST,我已经能够将数据从文件PUT到另一个服务器上,如下所示:
...
push: function(argv) {
fs.createReadStream('source_test.json').pipe(request.put('https://path/to/server/'));
}
...
和
//server-side
router.put('/', function (req, res, next) {
req.pipe(fs.createWriteStream('dest_test.json'));
res.status(200).end();
});
这很好用。现在我想将内容写入MongoDB而不是文件。我写得好#34;正常数据"到MongoDB,但我想知道将流数据写入数据库的典型方法是什么。我假设我必须等到流式传输完成然后写入数据库?
非常感谢任何建议,包括使代码更加健壮的建议。
答案 0 :(得分:1)
我们假设您以JSON文档的形式流式传输数据。
如果您要传输单个JSON文档,那么在传递它并发送到MongoDB驱动程序之前,您必须等待它到达。
但是如果您要传输一组文档,那么您应该能够在第一个文档到达后立即开始处理它们。
首先,有两种方法可以传输大量的JSON文档:
您可以使用event-stream
module解析它:
var es = require('event-stream')
req
.pipe(es.split())
.pipe(es.parse())
.pipe(es.map(function (doc, next) {
collection.insert(doc, next);
}))
您可以使用相同的模块从MongoDB流式传输数据。以下是使用mongoose执行此操作的示例:
collection
.find()
.stream()
.pipe(es.stringify())
.pipe(request.put(uri))
从流中解析JSON数组是一项更困难的任务,但您可以使用JSONStream
module执行此操作:
req
.pipe(JSONStream.parse('*'))
.pipe(es.map(function (doc, next) {
collection.insert(doc, next);
}))
从MongoDB流式传输数据:
collection
.find()
.stream()
.pipe(JSONStream.stringify())
.pipe(request.put(uri))
NB 确保您没有使用[body-parser
中间件]或任何其他尝试为您解析传入的JSON数据的中间件,因为它会使所有权益无效使用JSONStream
。