2015-12-17 65 views
1

我有一個應用程序需要一個data.json文件才能繪製一個d3圖。不過,我需要更新的onClick - 活動該文件:Javascript Node.js徹底覆蓋文件

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() - 功能是接收的數據通過HTTPS請求,處理這些數據,並保存到data.json:如果我秒鐘後反覆對我updateButton點擊

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

然而,似乎data.json不覆蓋,但文件變得越來越大,意味着數據被添加到文件而不是被覆蓋。

我在做什麼錯?

感謝您的幫助。

回答

2

既然您使用app.get作爲您的路線,我想您使用的是快遞。

在你的路由定義:

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/

+0

它@ dnkss23想從別的地方得到一個文件,並將其存儲在服務器上,似乎我。根本沒有從瀏覽器發佈數據。爲什麼數據需要中間存儲在服務器上,我不知道。 –

+0

這可以在服務器上完成,你不需要瀏覽器。最好在服務器上使用Request或類似的東西。 – blablabla

+0

是@LinusGustavLarssonThiel是對的!我想從其他地方加載數據並將其保存在服務器上。但是,保存的文件不會被覆蓋,而是將內容添加到現有文件中。爲什麼? – dnks23