nodejs fs.exists()和fs.existsAsync()已被弃用,但是为什么我仍然可以在Node v4和v6中使用它

我在这里阅读Nodejs文档https://nodejs.org/api/fs.html#fs_fs_exists_path_callback

它说fs.exists()fs.existsAsync()已被弃用。

所以我的直觉是,如果我使用更新版本的NodeJ,它会抛出一个错误。

但是,使用两个NodeJs v4.3.2和v6,我仍然看到fs.exists()工作。 为什么这样呢? 这是否意味着如果我从NodeJS v0.10.0迁移我的系统,我不一定要更新我的依赖项,调用这样的function,它是向后兼容?

Node.js中的稳定性级别0(或不赞成使用)意味着它可以在任何时候被删除,但不一定与下一个版本一起被删除。

不要依赖它们向后兼容,甚至不同版本之间即使存在相似的行为。

这意味着node.js开发背后的社区现在build议不要使用这个function,因为它有问题,将来可能会在某个时候将其清除,迫使人们停止使用它。

所以我的直觉是,如果我使用更新版本的NodeJs,它会抛出一个错误。

他们还没有把它抛出一个错误。

但是,使用两个NodeJs v4.3.2和v6,我仍然看到fs.exists()工作。 为什么这样呢?

而且,从你的问题的标题:

但为什么我仍然可以在Node v4和v6上使用它?

因为虽然他们现在build议不要使用它们,但还没有删除它。

这是否意味着如果我从NodeJS v0.10.0迁移我的系统,我不一定要更新我的依赖项,调用这样的function,它是向后兼容?

不。Node.js背后的社区告诉你,他们保留在未来版本中删除这两个函数的权利。

底线:如果你想兼容未来的版本,现在停止使用两个fs.exists()


fs.exists()也与其他node.jsasynchronousAPI不一致,因为callback函数并不遵循fn(err, data)的典型调用约定。 它没有使其成为古怪的err参数。

您可能还想了解他们使用问题的原因。 现代操作系统是一个多任务系统,文件系统是潜在的许多进程之间的共享资源。 这意味着如果你这样做:

 if (fs.existsSync("somefile")) { // execute some code when somefile does exist } else { // execute some code when somefile does not exist } 

那么,在运行fs.existsSync()调用的时间与假定它知道文件是否存在的代码执行时间之间,是否存在fs.existsSync()的状态可能会发生变化。 这就是所谓的“竞争条件”,它被认为是非常糟糕的devise,因为它创造了可能性非常难以复制的错误,偶尔可能会碰到(可能是最糟糕的错误来试图find)。

直接从fs.exists()的node.js文档中fs.exists()

在调用fs.open()之前使用fs.exists()检查文件是否存在,不build议使用fs.readFile()fs.writeFile() 。 这样做会引入争用条件,因为其他进程可能会更改两个调用之间的文件状态。 相反,用户代码应直接打开/读取/写入文件,并处理文件不存在时引发的错误。

如果你使用的是asynchronous版本fs.exists() ,那么竞争条件更糟,因为你自己的node.js代码甚至可以改变文件的状态,因为你的if / else逻辑运行。

取决于你通常想要做什么,非种族条件的替代品就是试图用某种独占访问来打开文件。 如果文件存在,您将成功打开它没有竞争条件。 如果这个文件不存在,你只会得到一个错误,然后你可以处理这个错误。 在其他一些情况下,您只是尝试使用一种模式创build文件,如果该模式已经存在,将会失败。 这两种情况都使用OS文件系统代码内部的primefaces比较,所以它们没有“竞争条件”。

你现在应该修复你的代码。 如果您仍然不明白推荐的修补程序是什么,那么请发布您使用fs.exists()的代码以及周围的代码上下文,我们可以帮助您进行更好的devise。

根据文档

稳定性:0 – 弃用此function已知存在问题,并且计划进行更改。 不要依赖它。 使用该function可能会导致警告。 向后兼容性不应该被期望。

换句话说,它可能在任何时候退出或以其他方式完全停止工作,恕不另行通知。 如果/当你迁移,它可能会或可能不会工作。

对于它的价值来说,在其他软件中的多个主要版本中保留不推荐使用的function并不典型。 在OSS世界中,我看到了只要项目被维护就被弃用的function。 大概是因为维护者/用户群对于不赞成使用的function有一定的用处,因为它对于他们的用例来说足够好(即使它不如应该/可能已经好,甚至开发了新的API)。