浅析 NodeJs 的几种文件路径
一、挖坑&掉坑:
缘起一段这样的代码:
fs.readFile('./docs/use.md',function(err,buffer){ if(err){ returnconsole.log('error:',err); } console.log('OK'); });
本地运行时一切OK,线上部署时却死活找不到./docs/use.md这个文件,后来才发现是因为线上启动应用时不是从当前目录启动了,不过为什么启动脚本的位置也会影响这个路径呢,且往下看。
二、填坑:
Node中的文件路径大概有__dirname,__filename,process.cwd(),./或者../,前三个都是绝对路径,为了便于比较,./和../我们通过path.resolve(‘./')来转换为绝对路径。
先看一个简单的栗子:
假如我们有这样的文件结构:
app/ -lib/ -common.js -model -task.js -test.js
在task.js里编写如下的代码:
varpath=require('path'); console.log(__dirname); console.log(__filename); console.log(process.cwd()); console.log(path.resolve('./'));
在model目录下运行nodetask.js得到的输出是:
/Users/guo/Sites/learn/app/model.js /Users/guo/Sites/learn/app/model.js/task.js /Users/guo/Sites/learn/app/model.js /Users/guo/Sites/learn/app/model.js
然后在app目录下运行nodemodel/task.js,得到的输出是:
/Users/guo/Sites/learn/app/model.js /Users/guo/Sites/learn/app/model.js/task.js /Users/guo/Sites/learn/app /Users/guo/Sites/learn/app
那么,不好意思不是问题来了~T_T,我们可以得出一些肤浅的结论了:
__dirname:总是返回被执行的js所在文件夹的绝对路径
__filename:总是返回被执行的js的绝对路径
process.cwd():总是返回运行node命令时所在的文件夹的绝对路径
./:跟process.cwd()一样、一样、一样的吗?
我明明记得在require(‘../lib/common')里一直都是各种相对路径写,也没见报什么错啊,我们还在再来个栗子吧,还是上面的结构,'model/task.js'里的代码改成:
varfs=require('fs'); varcommon=require('../lib/common'); fs.readFile('../lib/common.js',function(err,data){ if(err)returnconsole.log(err); console.log(data); });
在model目录下运行nodetask.js,一切Ok,没有报错。然后在app目录下运行nodemodel/task.js,然后很果断滴报错了:
那么这下问题真的都是来了,按照上面的理论,在app下运行时,../lib/common.js会被转成/Users/guo/Sites/learn/lib/common.js,这个路径显然是不存在的,但是从运行结果可以看出require(‘../lib/common')是OK的,只是readFile时报错了。
那么关于./正确的结论是:
在require()中使用是跟__dirname的效果相同,不会因为启动脚本的目录不一样而改变,在其他情况下跟process.cwd()效果相同,是相对于启动脚本所在目录的路径。
三、总结:
只有在require()时才使用相对路径(./,../)的写法,其他地方一律使用绝对路径,如下:
//当前目录下 path.dirname(__filename)+‘/test.js'; //相邻目录下 path.resolve(__dirname,‘../lib/common.js');
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。