使用fs.writeFile时未定义的值

时间:2017-06-22 15:16:05

标签: node.js fs

我正在使用node.js,我正在尝试读取文件夹并返回file.length,然后我想在txt文件上写入值。问题是,当我尝试使用fs.writeFile时,它会创建一个仅包含 undefined 世界的文件。

var length;
fs.readdir(dir, function(err, file) {
   length = file.length+1;
});
setTimeout(function(){
}, 1000);  
fs.writeFile('/public/images/value.txt', length, function(err) {
     if(err) {
        return console.log(err);
       }

     console.log("The file was saved!");
     console.log(length);
});
  

console.log(length)返回6

2 个答案:

答案 0 :(得分:2)

您在处理异步代码时遇到一些错误。 fs.readir()fs.writeFile()都是异步的。这意味着,你知道它们完成的唯一方法就是回调。

fs.readdir(dir, function(err, files) {
    if (err) return console.log(err);
    let length = files.length + 1;
    fs.writeFile('/public/images/value.txt', length, function(err) {
        if(err) return console.log(err);
        console.log("The file was saved!");
        console.log(length);
    });
});

// fs.readdir() has not yet completed when this part of your code runs
// it will complete some time late and then call its callback
// similarly fs.writeFile() has not yet completed when this part of your code runs

因此,如果您想使用fs.readdir()的结果,那么您应该在回调中使用它。如果您想知道fs.writeFile()何时完成并依赖其存在并且是最新的,那么您只能在其回调中执行此操作。

此外,setTimeout()不会阻止。它所做的就是安排一个计时器在将来的某个时间启动,而其余代码继续运行。因此,如果您要在此处使用setTimeout(),则必须将fs.writeFile()代码放在setTimeout()回调中。但是,这是一个黑客,并不是处理异步代码的推荐方法。您应该将fs.writeFile()置于fs.readdir()回调中,然后事情将100%可靠。

异步结果必须在实际回调中使用,表示异步操作完成或在该回调中调用的函数中。

答案 1 :(得分:0)

这是处理异步代码时的典型错误。您未定义的原因是因为第一个函数在执行fs.writefile函数时尚未完成读取目录,因此此时长度仍未定义。尝试将writefile函数放在setTimeout函数中。这应该成功。