在Nodejs中定期写入文件

时间:2018-10-08 17:05:34

标签: javascript node.js

我有一个通过异步调用找到的值 A A 将不断变化。因此,我想执行一些操作,例如每10秒记录一次,并将 A 的值写入带有时间戳的文件中。

所以我以此为起点https://codereview.stackexchange.com/questions/141329/write-log-file-in-nodejs-with-setinterval

var fs = require('fs');
var tStamp = new Date().now;
// getA() is the a async function
async function log(){
    fs.appendFile('c:/log.txt', tStamp + getA() , (err) => {
        if (err) throw err;
        logText = '';
    }); 
}
setInterval(log, 5000);

虽然不起作用。该函数不会重复调用。它似乎只被调用了一次,这显然不是我所希望的。我以为可能会使用类似的

var pieceOfLog = await getA();
在上述功能内部,

可能有所帮助,但没有帮助。那么在这里做什么?

  • 获取A的值
  • 记录
  • 无限重复广告。

我应该使用完全不同的方法吗? 我在代码中犯了一个愚蠢的错误吗? 我是否应该使用像Cron这样的库为我做这件事?

2 个答案:

答案 0 :(得分:3)

new Date().nowundefined。将其更改为Date.now()。这是一个静态函数。

确定getA()确实是异步的吗?

除此之外...

如果您不需要精确度(例如,可以一次在10.25秒之后,然后在下一次10.12秒,等等),那么setInterval(functionThatLogs, 10000)就可以做到。只需确保functionThatLogs是可快速附加到文件的函数即可。

如果文件很大或正在写入的数据非常重要,则可能需要查看管道,流等。但是,有关每10秒如何记录一次的问题……这可能是最简单的解决方案。

这是您提供的对我有用的代码的简化版本。我希望它也对您有用。它会删除getA(),因此如果此代码有效而您的代码无效,则getA()似乎有问题。

var fs = require('fs');
var path = require('path');
async function log(){
    fs.appendFile(path.join(__dirname, 'log.txt'), Date.now() + '\n', (err) => {
        if (err) throw err;
        logText = '';
    }); 
}
setInterval(log, 5000);

答案 1 :(得分:1)

getA()的签名是什么?它会返回承诺吗? 如果是,则:

async function log(){
    var tStamp = new Date().now;
    var a = await getA();
    fs.appendFile('c:/log.txt', tStamp + a, (err) => {
        if (err) throw err;
        logText = '';
    }); 
}
setInterval(log, 5000);

应该工作。 如果没有,您是否看到任何错误?

您很可能应该使用fs.appendFileSync以避免可能的异步问题。