2013-06-20 72 views
1

我試圖讓用戶以CSV格式導出自己的聯繫人列表。我很困惑如何運行export_connect_csv()函數。我應該把它放在子進程還是process.nextTick中?Process.nextTick或child_process?

function export_connect_csv(user_id, file_location){ 
     mysqlPool.getConnection(function(err, connection){ 
     var csv_row = "Email,First Name,Last Name,Status,Created\n"; 
     function processRow (row) { 
      var csv_row = row.email+','+row.first_name+','+row.last_name+','+row.status+','+row.created+"\n"; 
      fs.appendFile(file_location, csv_row, function (err) { 
      if(err){ 
       throw err; 
      } 
      }); 
     } 
     fs.appendFile(file_location, csv_row, function (err) { 
      if(err){ 
      throw err; 
      } 
      var query = connection.query('SELECT * FROM contacts where user_id = "'+user_id+'"'); 
      query 
      .on('error', function(err) { 
       //handle error 
      }) 
      .on('fields', function(fields) { 

      }) 
      .on('result', function(row) { 
       processRow(row); 
      }) 
      .on('end', function() { 
       //email now 

       console.log('done'); 
      }); 
     }); 
     }); 
    } 

    var exportContacts = function(req, res){ 
     var user_id = req.params.user_id || 0; 

     export_connect_csv(user_id); 
     res.json({}); 
    }; 
+0

你爲什麼想要把它在任何一個?爲什麼不叫它呢? –

+0

不會被阻擋? – Yalamber

+0

不,因爲你沒有做任何阻塞呼叫。 –

回答

0

你不需要使用任何一種,你可以調用函數。所有這些代碼都會以getConnection和fs.appendFile的形式異步運行。但是,在兩個用戶同時嘗試導出的情況下,您將遇到衝突。您有以下選擇:

1)你傳遞一個唯一FILE_NAME每次調用該函數

2)你讓事情,正是因爲他們是和使用fs.appendFileSync,以確保他們不相互重疊其他,但會阻止你

3)或者最好的解決方案是做你想要做的與Process.nextTick,而是你應該使用setImmediate和appendFileSync能夠同步寫入從幾個用戶(在一個時間只寫一列以避免阻塞長時間)

setImmediate(function(){ fs.appendFileSync('filename',JUST_A_SINGLE_ROWW) });

這是因爲遞歸process.nextTick可以餓死事件循環和effecively阻止你(因此使用setImmediate的),你需要使用fs.appendFileSync因爲兩個用戶可能會同時寫入同一個文件。

更多關於setImmediate VS nextTick:上appendFile setImmediate vs. nextTick

更多信息:http://nodejs.org/api/fs.html#fs_fs_appendfile_filename_data_options_callback

+0

所以我的代碼根本不會被阻塞。它會向瀏覽器發送響應,而csv文件寫入過程將在後臺運行?如果有超過1個用戶同時導出fiels,會發生什麼情況? – Yalamber

+0

編輯答案。 –

+0

你好,謝謝你的回覆。每個用戶的文件名永遠是唯一的。 – Yalamber