文件系统读取文件和 xml2js parseString 的挂起请求

Pending request with file system readFile and xml2js parseString

本文关键字:挂起 请求 parseString xml2js 读取 文件 文件系统      更新时间:2023-09-26

这是我正在使用的软件包的版本:

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();