在《Ajax-1-学习Ajax的契机》中,我用nodejs来把自己需要的内容写入到本地的文件中。那里用到了fs模块的writeFile方法,实现了就算文件存在也能重新写入的需要。
然后我希望能够每次生成的文件放在不同文件夹中。(这里我会自己给出文件夹的名字)这时候就遇到了一个问题,如何去判断文件夹是否存在?
我查看了fs模块以及百度了很多方法。描述如下:
1.fs.exists(),看名字我当时觉得这是最适合的方法。但其实它已经废弃了。故不建议使用。
2.fs.stat(),这个方法的回调函数中会有一个参数stats,它可通过stats.isDirectory来判断是不是根目录。大家说可以这么来判断文件是不是存在。然后我尝试了一下。使用了这个方法来判断一个本地还不存在的根目录。
运行后的结果如上图。也就是说,一个本地不存在的目录使得回调函数中的参数stats为undefined,然后用stats.isDirectory()会报错。
3.fs.access(),此方法不建议在fs.open,fs.readFile,fs.writeFile之前使用来检查一个文件的可访问性。
解决方法
方法一:
使用fs.access()。也许会疑惑说不是不建议在fs.writeFile前使用access吗?但这里应该是针对同一个文件而已。而我这里是判断目录是否存在。
方法二:
针对方法一,可以看到我对错误的处理。如果报错,我就默认为目录不存在。但可能错误还有别的。所以这边做一个小更改
在写代码时,我一直会纠结在一个地方,主要原因在于不能很熟练地使用回调函数。我的逻辑一直是这样的,如果目录存在怎么怎么样,如果目录不存在怎么怎么样。回调函数可以说是完成了前面半句话的实现。那么后面半句话怎么实现就是我们需要思考的。所以这边就需要考虑在回调函数中的第一个error的用处!在刚写代码的时候,遇到error时,大家都会这么写 if(err) ,这就给人一种报错终止的感觉。(我一度这么觉得)但其实并不是,这个error只是没满足这个API而产生的error,并不是程序的error,最重要的是这是一个我们需要的error。它是起到if else里面else的关键。
方法三:
(这个方法我在写上面的fs.stat时突然间想通)之前有说回调函数里面的stats都是undefine的,怎么用isDirectory来判断(网上很多人都建议这个方法,但也可能是时间太久,node的API有所改变的原因)。那么既然目录不存在时,stats是undefine的,是否可以用stats来判断呢?
经过验证,这种方法是可以成功的。
其实上面讲述的就两种方法。第一第二种方法提醒我们要对nodejs的error有一个比较全面的了解,这样才能有一个更好的判断。
上面的方法是不是好的方法,我也不清楚。让我选择的话,我觉得方法二可能最安全一些,因为方法三我也不能确定引起stats为undefined的就是目录不存在这种情况(感觉好无知啊。)如果有更好的方法,希望大家能一起分享。
领取专属 10元无门槛券
私享最新 技术干货