我可能不够深入,但我真的需要一些工作。我认为写/读流将解决我的问题,但我不太明白它的工作所需的语法或方法。 我阅读了流手册,并认为我理解了一些基础知识,但当我尝试将其应用到我的情况时,它似乎崩溃了。
目前我将此作为我信息的关键。
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!");
}
});
});
});
};
答案 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);
});
});