在Sails.js中将数据从文件管道传输到渲染页面

kk4*_*5kk 3 javascript stream node.js express 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: ??? });
Run Code Online (Sandbox Code Playgroud)

什么是最好的方法来解决这个问题?

sgr*_*454 5

根据您的示例,似乎最好的做法是设置一个单独的端点来仅提供数据,并通过常规<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("';");
    });

}
Run Code Online (Sandbox Code Playgroud)

MyView.ejs

<script language="javascript" src="/mydata/getdata?datatype=<%=datatype%>&etc.."></script>
Run Code Online (Sandbox Code Playgroud)

MyViewController.js

res.view('analytics', {datatype: 'someDataType', etc...});
Run Code Online (Sandbox Code Playgroud)

这种策略的一个细微变化是使用JSONP风格的方法; 您可以将其包装在函数中,而不是将数据包装在数据控制器操作中的变量中.然后,您可以通过AJAX调用端点来获取数据.无论哪种方式,您都可以获得快速页面加载的好处,因为大型数据集是单独加载的,但是通过JSONP变体,您还可以在等待数据时轻松显示加载指示符.