文件系统读取文件和 xml2js parseString 的挂起请求
Pending request with file system readFile and xml2js parseString
这是我正在使用的软件包的版本:
node.js 0.10.3
express 3.4.4
jade 0.35.0
xml2js 0.2.8
我遇到了一个奇怪的问题,我的第二个 ajax 请求(用于/tasks 的请求)在挂起状态停留了几分钟。
在这里,我的javascript调用:
$('#add-task').click(function(){
$.post('/addTask', function(){
loadTasks();
});
});
function loadTasks(){
$.get('/tasks', function(tasks){
$('#tasks > tbody').html(tasks);
});
}
这是我的路由文件:
exports.addTask = function(req, res){
fs.readFile(xmlPath, function(err, data) {
parser.parseString(data, function (err, result) {
var ws = fs.createWriteStream(xmlPath),
xw = new XMLWriter(true, function(string, encoding) {
ws.write(string, encoding);
});
xw.startDocument('1.0', 'UTF-8').startElement(function() {
return 'tasks';
});
for(var i in result.tasks.task) {
var task = xmlTaskToObject(result.tasks.task[i]);
writeTaskToXml(xw, task);
}
req.body.index = (result.tasks.task !== undefined) ? result.tasks.task.length : 0;
writeTaskToXml(xw, req.body);
xw.endElement();
ws.end();
res.send('');
});
});
};
exports.tasks = function(req, res){
var tasks = [];
fs.readFile(xmlPath, function(err, data) {
if(err){
throw err;
}
parser.parseString(data, function (err, result) {
console.log("AFTER PARSER");
// parsing stuff
/*
...
*/
res.render('tasks', { tasks: tasks });
});
});
};
"解析器之后"永远不会显示在控制台中,也不会引发异常......
我发现解决问题的唯一方法是执行第二次超时的ajax调用,如下所示:
$.post('/addTask', function(){
setTimeout(loadTasks, 100);
});
有人可以告诉我出了什么问题?我想这是一个文件访问问题或类似的东西。
谢谢!
您没有发送响应。 res.render
不执行 res.send。
这应该有效:
res.render('tasks', { tasks: tasks },
function(err, html) { res.send(html); } );
编辑:问题的另一部分与关闭文件有关。您需要等待 .end() 完成 (http://nodejs.org/api/stream.html#stream_writable_end_chunk_encoding_callback):
xw.endElement();
ws.on('finish', function() {
res.send('');
});
ws.end();
相关文章:
- Chrome浏览器“;挂起”;同时在循环中执行AJAX请求
- 如何在AngularJS中取消挂起的请求
- IE 10 挂起 XMLHttpRequest 6 分钟,然后响应请求(使用 AngularJS 实现 CRSF)
- 如何查明SignalR客户端上是否有挂起的请求
- 中止Angular中挂起的http请求未中止
- 文件系统读取文件和 xml2js parseString 的挂起请求
- 在 AngularJS 中中止挂起的 ajax 请求
- 节点/快速挂起的请求
- 由挂起导致的 AWS Lambda 函数“进程在完成请求之前退出”
- 如何在javascript中获取所有挂起的http请求
- Node.js 方法不返回任何响应,挂起请求
- 通过 .scope().call() 从 JS 外部调用 Angular 服务会挂起请求
- cakehp3 img挂起请求,image没有't负载
- 事件发射器发射一次,请求挂起
- 使用纯javascript检索挂起的AJAX请求数
- 当通过Ajax发送请求时,如何停止挂起页面
- 如何停止所有活动或挂起的ajax请求
- 等待等效请求挂起
- 异步队列挂起请求
- 在开发工具上发布api端点挂起请求