1

我试图允许用户以 csv 格式导出他们的联系人列表。我对如何运行 export_connect_csv() 函数感到困惑。我应该把它放在子进程还是 process.nextTick 中?

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({});
    };
4

1 回答 1

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 可以使事件循环饿死并有效地阻止您(因此使用 setImmediate)并且您需要使用 fs.appendFileSync 因为两个用户可能同时写入同一个文件。

更多关于 setImmediate vs nextTick: setImmediate vs. nextTick

有关 appendFile 的更多信息:http ://nodejs.org/api/fs.html#fs_fs_appendfile_filename_data_options_callback

于 2013-06-20T13:22:22.890 回答