2017-02-15 67 views
0

我想將我的javascript的輸出寫入文件,使用fs。但我注意到,當我把fs.appendFile()放在我的 ec2.describeSpotFleetRequests()內時,fs不起作用。針對這種情況的任何解決方法?將console.log的輸出寫入文件 - AWS Javascript SDK

示例代碼:

fs.appendFile('./spotfleet.txt', 'Hello world!', (err) => { 
    if (err) throw err; 
    console.log('It\'s saved!'); 
}); 

ec2.describeSpotFleetRequests(params,function(err, data) { 
    if (err) console.log(err, err.stack); 
    else { 
     for (var fleet in data.SpotFleetRequestConfigs) { 
      reqId = data.SpotFleetRequestConfigs[fleet].SpotFleetRequestId; // gets spot fleet ID 
      fs.appendFile('./spotfleet.txt', 'Hello world!', (err) => { 
       if (err) throw err; 
       console.log('It\'s saved!'); 
      }); 
     } 
    } 
}); 

第一fs.appendFile會寫的 「Hello world!」到spotfleet.txt但第二個fs.appendFile不會運行。

+0

使用控制流庫[異步](https://caolan.github.io/async/),可以像'async.series([fn1,fn2,fn3],function(){})''函數幫助 –

回答

0

正如szymonm在他的回答中提到的那樣,fs.appendFile()是異步的,所以我不能在循環中調用它。對於同步版本,有一個fs.appendFileSync()好東西。爲什麼我沒有注意到它,我不知道。

0

你是否嘗試過使用一些外部庫如winston?它內置支持保存日誌到一個單獨的文件:

winston.add(winston.transports.File, { filename: 'spotfleet.txt' }) 

configure()調用做到這一點:

winston.configure({ 
    transports: [ 
    new (winston.transports.File)({ filename: 'spotfleet.txt' }) 
    ] 
}) 

所有你使用引發的日誌,如:

winston.info('Hello world!') 

將被保存到所需的文件。它比console.log也更優雅......

UPDATE:

因爲你給一個代碼示例編輯你的問題,我看到這裏的問題。

fs.appendFile異步,所以你不能像你那樣在循環中調用它。

一旦一個fs.appendFile操作完成,使用回調保存另一件事。

+0

謝謝。我會嘗試使用溫斯頓。如果我遇到任何問題,我可以回覆您嗎? – Yvanne

+0

當然,隨時:) – szymonm

+0

@Yvanne請問你接受我的答案,如果它是正確的? :-) – szymonm