当使用NodeJS FS mkdir时,包含回调的重要性是什么?

When working with NodeJS FS mkdir, what is the importance of including callbacks?

本文关键字:回调 包含 重要性 是什么 NodeJS FS mkdir      更新时间:2023-09-26

我正在使用NodeJS REPL控制台并遵循本教程。

http://www.tutorialspoint.com/nodejs/nodejs_file_system.htm

我专注于File System(FS)模块。让我们看看用于创建目录的mkdir函数。

根据tutorialpoint,这是如何创建一个目录与FS

var fs = require("fs");
console.log("Going to create directory /tmp/test");
fs.mkdir('/tmp/test',function(err){
   if (err) {
       return console.error(err);
   }
   console.log("Directory created successfully!");
});

他们特别说你需要这个语法

fs.mkdir(path[, mode], callback)

好吧,我只是试着用更少的代码没有回调,它工作。

var fs = require('fs');
fs.mkdir('new-directory');

创建目录。语法应该是

fs.mkdir(path);

我不得不问,回调的目的是什么,你真的需要它吗?对于删除目录,我可以理解您为什么需要它,以防该目录不存在。但是我看不出mkdir命令有什么问题。似乎有很多不必要的代码。

从节点v10.0开始,需要回调到fs.mkdir()。你必须传递它,即使你只是传递一个不做任何事情的虚拟函数。

回调的目的是让你知道调用是否以及何时成功,如果没有成功,具体的错误是什么。

记住,这种类型的函数是异步的。它在未来完成一些未知的时间,所以知道它何时完成或是否成功完成的唯一方法是通过传递一个回调函数,当回调函数被调用时,你可以检查错误并看到它已经完成。

事实证明,mkdir()肯定会出错,例如错误的路径,权限错误等…所以错误肯定会发生。而且,如果您想立即使用新目录,则必须等到回调函数被调用后才能使用它。

作为对你的另一个评论的回应,无论你是否传递回调,fs.mkdir()函数始终是异步的。

下面是一个例子:

var path = '/tmp/test';
fs.mkdir(path, function (err) {
    if (err) {
        console.log('failed to create directory', err);
    } else {
        fs.writeFile(path + "/mytemp", myData, function(err) {
            if (err) {
                console.log('error writing file', err);
            } else {
                console.log('writing file succeeded');
            }
        });
    }
});

注意:现代版本的nodejs,包括fs.promises.mkdir(),它返回一个承诺来解析/拒绝,而不是使用普通的回调。这允许您将awaittry/catch.then().catch()一起使用,而不是使用普通的回调来知道何时完成,并且承诺通常使其更容易与其他异步操作排序并集中错误处理。

因为mkdir是async .

例子:

如果你这样做:

fs.mkdir('test');
fs.statSync('test').isDirectory();//might return false cause it might not be created yet

但是如果你这样做了:

fs.mkdir('test', function() {
    fs.statSync('test').isDirectory();//will be created at this point
});

如果您需要sync版本,您仍然可以使用mkdirSync

使用mkdir可能会出很多问题,您应该处理异常和错误,并在可能的情况下将它们返回给用户。

mkdir /foo/bar可能会出错,因为您可能需要root (sudo)权限才能创建顶级文件夹。

然而,回调背后的一般思想是你使用的方法是异步的,并且考虑到Javascript的工作方式,你可能希望在目录创建后得到通知并继续你的程序执行。

Update:请记住,如果你需要——比方说——在目录中保存一个文件,你需要使用回调:

fs.mkdir('/tmp/test', function (err) {
    if (err) {
        return console.log('failed to write directory', err);
    }
    // now, write a file in the directory
});
// at this point, the directory has not been created yet

我还建议你看一下承诺,它现在比回调更常用。

因为这是一个异步调用,所以程序的进一步执行可能取决于操作的结果(dir是否成功创建)。当回调执行的时候是第一个可以检查的时间点。

然而,这个操作非常快,看起来好像是立即发生的,但实际上(因为它是异步的),fs.mkdir(path);之后的以下行将在不等待fs.mkdir(path);的任何反馈的情况下执行,因此没有任何保证目录创建已经完成,或者如果它失败了。