繁体   English   中英

Javascript Node.js完全覆盖文件

[英]Javascript Node.js overwrite File completely

我有一个需要data.json文件才能绘制d3图的应用程序。 但是我需要在onClick -Event上更新该文件:

d3.select("#updatebutton").on("click", function(e) {
        try{
            $.get('https://localhost:4444/data', function(data) {
            });
        }
        catch (e) {
            alert('Error: ' + e);
        }
    });

上面是带有jquery调用的update-Button。 在我的app.js文件中,我像这样使用它:

app.get('/data', function(req, res, next) {
    try{
        getJSON();
}
catch(e) {
    alert('Error');
    }

});

getJSON() -Function通过https-Request接收数据,处理该数据并将其保存到data.json

function getJSON() {
      var req = https.get(options, function(response) {
    // handle the response
    var res_data = '';
    response.on('data', function(chunk) {
        res_data += chunk;
    });
    response.on('end', function() {
        //process data
        // save to file
        fs.writeFile(filePath, JSON.stringify(finalJson), function(err) {
        if (err)
            throw err;
        });
    });
});
}

但是,如果我几秒钟后反复单击我的updateButton ,似乎data.json不会被覆盖,但是文件越来越大,这意味着数据将被添加到文件中而不是被覆盖。

我究竟做错了什么?

感谢帮助。

由于您使用app.get作为路线,所以我猜您正在使用express。

在您的路线定义中:

var getData = (function() {

    var callbacks = [];

    function executeCallbacks(err, data) {
        for (var i = 0; i < callbacks.length; i++) {
            callbacks[i](err, data);
        }
        callbacks = [];
    }

    return function(cb) {
        callbacks.push(cb);

        if( callbacks.length === 1 ) {

            var req = https.get(options, function(response) {

                // handle the response
                var res_data = '';

                response.on('data', function(chunk) {
                    res_data += chunk;
                });

                response.once('end', function() {

                    // process data here

                    // save to file
                    fs.writeFile(filePath, JSON.stringify(finalJson), function(err) {
                        if (err) {
                            // call error handler
                            return executeCallbacks(err);
                        }

                        executeCallbacks(null, body);
                    });
                });

                response.once('error', function() {
                    return executeCallbacks(err);
                });
            }

            req.end();
        }
    };
})();



app.get('/data', function(req, res, next) {

    getData(function(err, data) {
        if(err) {
            return next(err);
        }

        return data;
    });

});

在浏览器js文件中:

d3.select("#updatebutton").on("click", function(e) {
    $.get( 'https://localhost:4444/data', function(data) {
        alert( "success" );
        var json = JSON.parse(data);
    })
   .fail(function() {
       alert( "error" );
   });
});

我看到您使用try / catch回调函数。 原始函数完成后,将触发回调函数。 因此,请勿使用Try / Catcharound回调函数。

阅读: https : //strongloop.com/strongblog/async-error-handling-expressjs-es7-promises-generators/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM