writestream和express为json对象?

时间:2014-08-01 12:53:09

标签: javascript sql-server json node.js express

我可能不够深入,但我真的需要一些工作。我认为写/读流将解决我的问题,但我不太明白它的工作所需的语法或方法。 我阅读了流手册,并认为我理解了一些基础知识,但当我尝试将其应用到我的情况时,它似乎崩溃了。

目前我将此作为我信息的关键。

function readDataTop (x) {
    console.log("Read "+x[6]+" and Sent Cached Top Half");
    jf.readFile( "loadedreports/top"+x[6], 'utf8', function (err, data) {
        resT = data
    });
};

我正在使用节点的Jsonfile插件,它基本上缩短了fs.write并且更容易编写,而不是不断地为fs.write写入catch和try块。阅读。

无论如何,我想在这里实现一个流,但我不确定我的快递将会发生什么以及如何接收该对象。

我假设因为它的一个流表达不会对该对象做任何事情,直到它收到它为止?或者我是否必须编写回调函数以确保在调用函数时,在快速发送对象之前完成流以完成ajax请求?

app.get('/:report/top', function(req, res) {
    readDataTop(global[req.params.report]);
    res.header("Content-Type", "application/json; charset=utf-8");
    res.header("Cache-Control", "max-age=3600");
    res.json(resT);
    resT = 0;
});

我希望如果我将读取部分更改为流,它将会解决两个问题。当浏览器由于较大的json对象的读取速度而进行ajax调用时,有时会接收公正的json文件的问题。 (这可能是我需要解决的回调问题,但是流应该使它更加一致)。

然后,当我加载此节点应用程序时,它需要在从我的数据库获取数据时运行30多个写入文件。目标是断开浏览器与数据库端的连接,以便节点通过读写来充当数据库。这是由于旧的SQL服务器已被许多请求轰炸(陈旧的数据不是问题)。

这里有关于语法的任何帮助吗?

是否有一个教程我可以在代码中看到有人将响应流入写入流? (我使用的mssql节点将SQL响应放入一个对象中,我需要JSON格式)。

function getDataTop (x) {
    var connection = new sql.Connection(config, function(err) {
        var request = new sql.Request(connection);
        request.query(x[0], function(err, topres) {
            jf.writeFile( "loadedreports/top"+x[6], topres, function(err) {
                if(err) {
                    console.log(err);
                } else {
                    console.log(x[6]+" top half was saved!");
                }
            });
        });
    }); 
};

1 个答案:

答案 0 :(得分:1)

您的问题是您在发送响应之前没有等待加载文件。使用回调:

function readDataTop(x, cb) {
  console.log('Read ' + x[6] + ' and Sent Cached Top Half');
  jf.readFile('loadedreports/top' + x[6], 'utf8', cb);
};

// ...

app.get('/:report/top', function(req, res) {
  // you should really avoid using globals like this ...
  readDataTop(global[req.params.report], function(err, obj) {
    // setting the content-type is automatically done by `res.json()`

    // cache the data here in-memory if you need to and check for its existence
    // before `readDataTop`

    res.header('Cache-Control', 'max-age=3600');
    res.json(obj);
  });
});