无法在下面的脚本中找到问题,我想用脚本实现的是让一个节点日志服务器以日志标题和日志详细信息作为查询参数来监听post
请求,写入一个文件然后在get
请求上以json的形式返回。
问题: 它会不时地显示加载器并在某个时间提供所需的日志。
注意: 如果有人有更好的解决方案,那么在记录期间完成过程产生以更新浏览器,PLZ建议
发布电话:
http://127.0.0.1:8081/log?title="test"&detail="test detail"
代码:
var express = require("express");
var spawn = require('child_process').spawn;
var fs = require("fs");
var srv = express();
var outputFilename = '/tmp/my.json';
function getParamsObject(context) {
var params = {};
for (var propt_params in context.params) {
params[propt_params] = context.params[propt_params];
//define(params, propt_params, context.params[propt_params]);
}
for (var propt_body in context.body) {
params[propt_body] = context.body[propt_body];
//define(params, propt_body, context.body[propt_body]);
}
for (var propt_query in context.query) {
params[propt_query] = context.query[propt_query];
//define(params, propt_query, context.query[propt_query]);
}
return params;
}
srv.get("/", function(req, res) {
res.send("Hello World From Index\n");
});
srv.get("/Main", function(req, res) {
res.send("Hello World From Main\n");
});
srv.get("/ReadFile", function(req, res) {
fs.readFile("example_one.txt", function(err, data) {
if(err) throw err;
res.send(data.toString());
});
});
srv.get("/ReadFileJSON", function(req, res) {
fs.readFile("example_one.txt", function(err, data) {
if(err) throw err;
res.setHeader("content-type", "application/json");
res.send(new Parser().parse(data.toString()));
});
});
srv.post("/log", function(req, res) {
var input = getParamsObject(req);
if(input.detail) {
var myData = {
Date: (new Date()).toString(),
Title: input.title,
Detail: input.detail
}
fs.writeFile(outputFilename, JSON.stringify(myData, null, 4), function(err) {
if(err) {
console.log(err);
}
});
}
res.setHeader("content-type", "application/json");
res.send({message:"Saved"});
});
srv.get("/log", function(req, res) {
var child = spawn('tail', ['-f', outputFilename]);
child.stdout.pipe(res);
res.on('end', function() {
child.kill();
});
});
srv.listen(8081);
console.log('Server running on port 8081.');
答案 0 :(得分:2)
澄清问题......
tail
来实现此目的。问题:它会不时地显示加载程序并在某个时间提供所需的日志。
Web浏览器缓冲数据。当然,您确实要发送数据,但浏览器在达到最小缓冲区大小之前不会显示它。然后,当所有标记(或者仅仅是这种情况下的文本)尚未加载时,会有显示内容的规则。基本上,您无法将响应流式传输到客户端,并可靠地期望客户端对其执行任何操作,直到完成流式传输。由于你正在追踪日志,这会让你陷入困境。
您必须做的是找到一种不同的方式将数据发送到客户端。这是Web套接字的一个很好的候选者。您可以在客户端和服务器之间创建持久连接,然后立即处理数据,而不是担心客户端缓冲区。由于你已经在使用Node.js,我建议调查Socket.IO,因为它提供了一种快速启动和运行Web套接字的方法,以及长时间轮询JSON(以及其他)作为后备,以防万一网络套接字和#39; t在当前浏览器上可用。
接下来,不需要以tail
的方式生成另一个进程来读取文件。正如Trott指出的那样,有一个NPM包可以完全满足您的需求:https://github.com/lucagrulla/node-tail只需为line
事件设置事件处理程序,然后在该事件上触发line
事件。 Web套接字,以便您的JavaScript客户端接收它并立即将其显示给用户。
答案 1 :(得分:1)
有一些事情似乎很突出,因为不必要的并发症可能是你问题的根源。
首先,spawn
似乎没必要。看来你想打开一个文件进行阅读,并在任何东西被添加到文件时得到更新。您可以在包含fs.watch()
,fs.watchFile()
或node-tail
模块的节点中执行此操作。这可能比使用spawn()
创建子进程更强大。
第二个(我认为不太可能成为问题的根源),您似乎在POST
请求中使用查询字符串参数。虽然没有效果,但这很不寻常。通常,如果您使用POST
方法,则通过post发送数据,作为请求正文的一部分。如果使用GET
方法,则数据将作为查询字符串发送。如果您没有使用正文发送数据,请切换到GET
。