关于node.js中fs的问题

目的

要知道什么时候fs.writeFileSync()fs.writeFile()完成写入文件,所以我可以执行另一个函数。

背景

我正在使用fs编写一个文件,为了知道文件写完的时间,我检查了它的文档:

  • https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback

读完之后,我将注意力集中在fs.writeFile()fs.writeFileSync()但是我发现缺less文档,我怀疑。

关于fs.writeFile()

  1. 在写入文件之前调用callback函数,因为正在写入文件或写入并保存在磁盘中之后?

关于fs.writeFileSync()

  1. 如何知道是否发生错误,如果它总是返回undefined
  2. 作为一个同步写入,这是否意味着我的代码将被迫等待,直到文件被完全写入?

一般的问题

  1. 如果我想同时写两个不同的文件,并且在两者都完成时执行一个单独的操作,那么我将如何使用fs.writeFile()来执行操作?
  2. NPM中有用户友好的图书馆是否有这样的工作? 我搜查,但我没有发现任何令人信服的。

结论

我总是与fs混淆,我的知识不足以最大限度地使用我的代码。 为了改进,我需要看到更多的代码示例,因此,代码示例的答案将是首选。


感谢您的时间 !

首先,这里有一个重要的提示。 如果文档没有解释某些东西,并且您不能用一个简单的testing来轻松回答这个问题,那么您可以随时查看GitHub上的源代码。 例如, 以下是Github上fs.writeFileSync()的源代码 。 这是开源项目的巨大优势之一。 如果有疑问,只要看看代码。

有时,find正确的源代码并不那么容易(GitHubsearch往往会在testing用例代码中find比原始源代码多10倍的search结果)。 在这种情况下,您可以在debugging器中的代码中设置一个断点,然后直接进入相应的函数。 debugging器会把你的权利,你可以看到它到底在做什么。

现在你的问题…

关于fs.writeFile()的问题

在写入文件之前调用callback函数,因为正在写入文件或写入并保存在磁盘中之后?

在写入文件(或遇到错误)后调用它。

关于fs.writeFileSync()的问题

  1. 如何知道是否发生错误,如果它总是返回undefined?

如果有错误,fs.writeFileSync将抛出exception。 您必须使用try / catch来捕获任何exception。

  1. 作为一个同步写入,这是否意味着我的代码将被迫等待,直到文件被完全写入?

是的,同步版本将会阻塞,直到文件被完全写入。 你不会在正常的服务器开发中使用同步版本,因为它会占用主要的node.js线程。

一般的问题

如果我想同时写两个不同的文件,并且在两者都完成时执行一个单独的操作,那么我将如何使用fs.writeFile()来执行操作?

目前这种types的问题的典型devise模式是使用promise和Promise.all()来跟踪多个asynchronous操作的完成。

使用蓝鸟承诺库:

 const Promise = require('bluebird'); const fs = Promise.promisifyAll(require('fs')); Promise.all([fs.writeFileAsync(fname1, data1), fs.writeFileAsync(fname2, data2)]).then(function() { // both async operations are done here }).catch(function(err) { // handle error here }); 

Bluebird的.promisifyAll()方法将fs模块中的每个asynchronous操作封装为一个返回promise的函数,并用Async后缀命名包装的版本,所以fs.writeFile()获取fs.writeFileAsync() ,返回promise而不是直接回电话。 然后,您可以使用Promise控制stream(例如Promise.all()来pipe理或协调多个asynchronous操作。

您不必为此使用Bluebird库,因为Promise现在已经构build到node.js中(而且是ES6规范的一部分),但是node.js没有那么容易的将现有的asynchronouscallback函数转化为promise返回函数和蓝鸟呢。 如果你愿意的话,你可以自己做这个promisification。

 const fs = require('fs'); fs.writeFileAsync = function(fname, data) { return new Promise(function(resolve, reject) { fs.writeFile(fname, data, function(err) { if (err) return reject(err); resolve(); }); }); } Promise.all([fs.writeFileAsync(fname1, data1), fs.writeFileAsync(fname2, data2)]).then(function() { // both async operations are done here }).catch(function(err) { // handle error here }); 

这么多的问题让我们走吧:

fs.writeFile() …)在写入文件之前调用callback函数,因为正在写入文件或写入并保存在磁盘中之后?

手术完成后,无论成功与否。

fs.writeFileSync() …)如何知道如果总是返回undefined的错误?

它会抛出一个exception 。

作为一个同步写入,这是否意味着我的代码将被迫等待,直到文件被完全写入?

是! 这是一个同步function的重点。


如果我想同时写两个不同的文件,并且在两者都完成时执行一个单独的操作,那么我将如何使用fs.writeFile()来执行操作?

这里有一个方法:

 const fs = require('fs'); let completions = 0; function onComplete(err) { if(err) { console.log('An error occurred', err); } completions++; if(completions === 2) { console.log('All done!'); } } fs.writeFile('file1.txt', 'Hello', onComplete); fs.writeFile('file2.txt', 'World', onComplete); 

NPM中有用户友好的图书馆是否有这样的工作? 我搜查,但我没有发现任何令人信服的。

不完全(我知道…),但你应该看看使用承诺和promisified fs电话。 那么你将可以使用Promise.all ,它会看起来更好!

在写入文件之前调用fs.writeFile()callback函数,因为正在写入文件或写入文件并保存在磁盘中之后?

当文件写入磁盘时调用该函数。

如何知道fs.writeFileSync()是否总是返回undefined发生错误?

 > fs.writeFileSync('/test', 'foo') Error: EACCES: permission denied, open '/test' at Error (native) ... 

它会throw一个错误,你可以try..catch

fs.writeFileSync()是一个同步写入,这是否意味着我的代码将被迫等待,直到文件被完全写入?

是; 与所有同步函数一样,您的代码将会阻塞,直到函数返回。

如果我想同时写两个不同的文件,并且在两者都完成时执行一个单独的操作,那么我将如何使用fs.writeFile()来执行操作?

使用承诺 :

 let write1 = new Promise((resolve, reject) => { fs.writeFile(file1, data1, err => { if (err) { reject(err); } else { resolve(); } }); }); let write2 = new Promise(/* same thing here */); Promise.all([write1, write2]).then(() => { console.log('both writes done'); }); 

fs.writeFile()是asynchronous的。 这意味着在写入文件之后发生callback。 fs.writeFileSync()不是,这意味着它是非阻塞的,其他的继续代码将被执行。 要写入两个单独的文件,并且一旦完成后就可以做一些事情,你可以简单地嵌套aysnccallback

 fs.writeFile('test.txt', 'text', function(){ fs.writeFile('test2.txt', 'text', function(){ console.log('done'); }); }); 

要知道同步function有错误,您可以使用exception。

这就是你要找的东西:

Q1)在写入文件之前调用callback函数,因为正在写入文件或写入文件并保存在磁盘中之后?

Ans1)callback函数在写入文件操作尝试后返回错误或成功。 试图失败或写入成功。 所以它会返回错误,成功callback。 所以最后,在“写入文件操作尝试”之后调用callback函数。

Q2)如何知道错误是否总是返回undefined?

Ans2)你可以使用try和catch,因为如果写入成功,则返回没有响应,但是如果失败的话。 你会得到一个例外。

Q3)作为一个同步写入,这是否意味着我的代码将被迫等待,直到文件被完全写入?

Ans3)是的,在写完整个文件写入任务之前,不要让其他的语句/操作执行。

Q4)如果我想同时写两个不同的文件,并且在两者都完成时执行一个单独的操作,那么我将如何使用fs.writeFile()来执行?

Ans4)因此,在这种情况下,您可以使用callback或承诺。 简而言之, 如果他们彼此依赖,你可以一个接一个地链接任务。 但是如果它们彼此独立,只需简单的写两块代码即可。 它会很容易写。 下面给出的代码是两个独立的任务。

fs.writeFile('file.txt', 'hello', function(error){ //do something }); fs.writeFile('file1.txt', 'Amulya', function(error){ //do something});

他们都会在同一时间执行,因为asynchronous的性质,他们将完成没有任何麻烦。

Q5)NPM是否有用户友好的图书馆进行这种工作? 我搜查,但我没有发现任何令人信服的。

Ans5)如上例所示,如果bopth任务是相互独立的,则不需要NPM库。 如果他们相互依赖的手段,那么你可以使用asyncbluebird 链或promisify它们。