2017-02-15 69 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