【问题标题】:Javascript Node.js overwrite File completelyJavascript Node.js 完全覆盖文件
【发布时间】:2016-03-23 16:43:01
【问题描述】:

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

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

上面是带有 jquery 调用的更新按钮。在我的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 没有被覆盖,但文件越来越大,这意味着数据被添加到文件中而不是被覆盖。

我做错了什么?

感谢您的帮助。

【问题讨论】:

    标签: javascript json node.js fs writefile


    【解决方案1】:

    由于您使用 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 / Catch。

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

    【讨论】:

    • 在我看来@dnkss23 想从其他地方获取文件,并将其存储在服务器上。根本不发布来自浏览器的数据。为什么数据需要中间存储在服务器上,我不知道。
    • 这可以单独在服务器上完成,您不需要浏览器。最好在服务器上使用 Request 或类似的东西。
    • 是的@LinusGustavLarssonThiel 是对的!我想从其他地方加载数据并将其保存在服务器上。但是,保存的文件不会被覆盖,但内容会添加到现有文件中。为什么?
    • @blablabla 但我希望用户能够通过按钮单击事件手动更新数据。所以我确实需要浏览器,对吧?我尝试了您的解决方案,但它没有解决“覆盖问题”,并且我收到一个额外的错误:“发送后无法设置标题。”
    • 从你的例子来看,这根本没有意义。我的猜测是示例中的“//处理数据”中发生了一些事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 2014-08-19
    • 2013-05-01
    • 2017-12-22
    • 2019-04-20
    • 2016-05-12
    • 1970-01-01
    相关资源
    最近更新 更多