首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NodeJS -如何使用内存中的DB流式传输响应?

NodeJS -如何使用内存中的DB流式传输响应?
EN

Stack Overflow用户
提问于 2017-10-23 21:07:30
回答 2查看 412关注 0票数 0

如何使用内存中的DB流式传输响应?

我使用Loki JS作为内存DB。有一个特定的资源,我必须返回表的全部内容(不能分页),这个表可以增长到大约500,000个项目,大约300mb。

在其他情况下,我使用fs.createReadStream获取文件并将其流回给用户:

代码语言:javascript
运行
复制
fs.createReadStream('zips.json')
  .on('data', function() {
    res.write(...)
  })
  .on('end', function() {
    res.end();
  })

这对于大文件非常有效,但是我如何使用内存中的DB来做一些等效的事情呢?

代码语言:javascript
运行
复制
const items = lokiDb.addCollection('items');
items.insert('a bunch of items ...');

// I would now like to stream items via res.write
res.write(items)

目前,res.write(items)会导致内存问题,因为Node试图一次返回整个响应。

EN

回答 2

Stack Overflow用户

发布于 2017-10-23 21:53:15

据我所知,在Loki中没有本地流提供程序,尽管我可能错过了它。您可能想要做的是监听集合上的'insert‘事件,并编写该事件,如下所示:

代码语言:javascript
运行
复制
const items = lokiDb.addCollection('items');
items.on('insert', (results) => {
  res.write(results);
});

items.insert('a bunch of items ...');
票数 0
EN

Stack Overflow用户

发布于 2017-10-26 19:47:47

如果我是正确的,基本上您的问题是readStreams只从文件中读取,而您希望从内存中的数据结构中读取。一个解决方案可能是定义您自己的readStream类,稍微修改一下原型stream.Readable._read方法:

代码语言:javascript
运行
复制
var util = require('util');
var stream = require('stream');

"use strict";
var begin=0, end=0;
var options = {
    highWaterMark:  16384,
    encoding:       null,
    objectMode:     false
};

util.inherits(InMemoryStream, stream.Readable);

function InMemoryStream(userDefinedOptions, resource){

    if (userDefinedOptions){
        for (var key in userDefinedOptions){
            options.key = userDefinedOptions[key];
        }
    }

    this.resource = resource;
    stream.Readable.call(this, options);
}


InMemoryStream.prototype._read = function(size){

    end += size;
    this.push(this.resource.slice(begin, end));
    begin += size;

    }

exports.InMemoryStream = InMemoryStream;    
exports.readStream = function(UserDefinedOptions, resource){
    return new InMemoryStream(UserDefinedOptions, resource);
}

将内存中的数据结构(在下面的示例中是一个数组)转换为readStream,并通过管道将其传递给writeStream,如下所示:

代码语言:javascript
运行
复制
"use strict";

var fs = require('fs');
var InMemoryStream = require('/home/regular/javascript/poc/inmemorystream.js');

var stored=[], writestream, config={};

config = {
    encoding: null,
    fileToRead: 'raphael.js',
    fileToWrite: 'secondraphael.js'
}

fs.readFile(config.fileToRead, function(err, data){
    if (err) return console.log('Error when opening file', err);
    stored = data;

    var inMemoryStream = InMemoryStream.readStream({encoding: config.encoding}, stored);
    writestream = fs.createWriteStream(config.fileToWrite);
    inMemoryStream.pipe(writestream);

    inMemoryStream.on('error', function(err){
        console.log('in memory stream error', err);
    });


});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46890142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档