将数据从Sails.js中的文件管道传输到渲染页面
Piping data from a file to a rendered page in Sails.js
我的应用程序需要读取一个大型数据集,并将其传输到客户端以使用D3.js进行操作。问题是,在大型数据集上,读取/加载文件内容可能需要一段时间。我想使用流来解决这个问题。然而,我不确定如何在Sails框架的背景下做到这一点。
我想做的是读取文件的内容,并通过管道将其传输到渲染页面。然而,如果我使用res.view('somePage', { data: thePipedData });
之类的东西,我不知道如何通过管道传输。
我现在有这样的东西:
var datastream = fs.createReadStream(path.resolve(DATASET_EXTRACT_PATH, datatype, dataset, dataset + '.csv'));
datastream.pipe(res);
...
return res.view('analytics', { title: 'Analytics', data: ??? });
最好的方法是什么?
根据您的示例,最好的做法似乎是设置一个单独的端点来只提供数据,并通过常规的<script>
标记将其包含在客户端上。
MyDataController.js
getData: function(req, res) {
/* Some code here to determine datatype and dataset based on params */
// Wrap the data in a Javascript string
res.write("var theData = '");
// Open a read stream for the file
var datastream = fs.createReadStream(
path.resolve(DATASET_EXTRACT_PATH, datatype, dataset, dataset + '.csv')
);
// Pipe the file to the response. Set {end: false} so that res isn't closed
// when the file stream ends, allowing us to continue writing to it.
datastream.pipe(res, {end: false});
// When the file is done streaming, finish the Javascript string
datastream.on('end', function() {
res.end("';");
});
}
MyView.ejs
<script language="javascript" src="/mydata/getdata?datatype=<%=datatype%>&etc.."></script>
MyViewController.js
res.view('analytics', {datatype: 'someDataType', etc...});
这一策略的一个细微变化是使用JSONP风格的方法;与其在数据控制器操作中将数据包装在变量中,不如将其包装在函数中。然后,您可以通过AJAX调用端点来获取数据。无论哪种方式,您都可以快速加载页面,因为大型数据集是单独加载的,但使用JSONP变体,您也可以在等待数据时轻松显示加载指示符。
相关文章:
- 如何检查管道中未定义的项目
- d3js文本传输-示例代码不起作用
- 通过AJAX传输变量
- 派生进程的stdout在管道传输时工作异常
- Rails资产管道-只向head添加jquery
- 使用Tabris-js,并尝试使用cordova文件和文件传输插件
- Rails资产管道-自定义js文件
- Rails 4资产管道Heroku生产javascript参考问题
- 如何通过资产管道提供Javascript中子文件夹中的图像
- 使用Emscripten Worker API传输数据而不进行复制
- 从输入中读取并将其内容作为输出进行管道传输
- 限制 Node.js 中同时通过管道传输的 HTTP 请求
- 如何通过管道传输到文件 (NodeJS)
- 节点.js将相同的可读流管道传输到多个(可写)目标
- 如何将文件通过管道传输到 keen.io
- WinstonMongoDB:如何将日志管道传输到多个集合,而不是全部传输到一个集合
- 将Bower的供应商js文件和自己的js文件管道传输到Gulp中的唯一流中
- 将数据从Sails.js中的文件管道传输到渲染页面
- 如何将一个可读流管道传输到另一个可读流
- 如何将mysql数据管道传输到浏览器窗口,而不是Nodejs中的控制台