Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带有文件系统readFile和xml2js parseString的挂起请求_Javascript_Node.js_Express - Fatal编程技术网

Javascript 带有文件系统readFile和xml2js parseString的挂起请求

Javascript 带有文件系统readFile和xml2js parseString的挂起请求,javascript,node.js,express,Javascript,Node.js,Express,这是我正在使用的软件包的版本: 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(); }); }); func

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

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 });
        });
    });
};
控制台中永远不会显示“AFTER PARSER”,也不会抛出异常

我发现解决此问题的唯一方法是使用超时执行第二个ajax调用,如下所示:

$.post('/addTask', function(){
    setTimeout(loadTasks, 100);
});
有人能告诉我怎么了吗?我猜是文件访问问题或类似的问题


谢谢

您没有发送响应
res.render
不执行res.send

这应该起作用:

        res.render('tasks', { tasks: tasks }, 
                   function(err, html) { res.send(html); } );
编辑: 问题的另一部分与关闭文件有关。您需要等待.end()完成():


你在写什么东西吗?之后你要关闭文件吗?我认为您没有显示所有需要回答的代码。我下面的回答指向了另一个问题。好的,我编辑了,我如何关闭文件?我试过了,但问题仍然存在,实际上我认为它没有达到这一部分,因为控制台中没有显示“解析后”。谢谢,它可以工作。我知道这是一个文件访问问题,但不知道end()是异步完成任务的。node.js中的所有内容不是异步的吗?:-)是的,我是node.js的新手,所以很难一直意识到这一点。
        xw.endElement();
        ws.on('finish', function() {
            res.send('');
        });
        ws.end();