1.挖坑&掉坑:起源于这样一段代码:fs.readFile('./docs/use.md',function(err,buffer){if(err){returnconsole.log('error:',err);}console.log('OK');});在本地运行一切正常,但是在线部署时找不到文件./docs/use.md。后来发现是因为在线启动应用的时候不是从当前目录启动应用,但是为什么启动脚本的位置也会影响这个路径,往下看。2、填坑:Node中的文件路径大概有__dirname、__filename、process.cwd()、./或../。前三个是绝对路径。为了比较,./和../我们通过path.resolve('./')转换为绝对路径。先看个简单的栗子:假设我们有这样一个文件结构:app/-lib/-common.js-model-task.js-test.js在task.js中写下如下代码:varpath=require('路径');console.log(__dirname);console.log(__filename);console.log(process.cwd());console.log(path.resolve('./'));在model目录下运行nodetask.js的输出是:/Users/guo/Sites/learn/app/model/Users/guo/Sites/learn/app/model/task.js/Users/guo/Sites/learn/app/model/Users/guo/Sites/learn/app/model然后在app目录下运行nodemodel/task.js,输出为:/Users/guo/Sites/learn/app/model/Users/guo/Sites/learn/app/model/task.js/Users/guo/Sites/learn/app/Users/guo/Sites/learn/app好吧,抱歉这不是问题~T_T,我们可以得出一些肤浅的结论:__dirname:total返回执行的js所在文件夹的绝对路径__filename:始终返回执行的js的绝对路径process.cwd():始终返回运行node命令的文件夹的绝对路径./:后面byprocess.cwd()是一样的,一样的,一样的吗?我清楚的记得require('../lib/common')里面写了各种相对路径,也没看到有错。再举个栗子,还是上面的结构,'model/task.js'到:varfs=require('fs');varcommon=require('../lib/common');fs.readFile('../lib/common.js',function(err,data){如果(错误)返回console.log(错误);console.log(数据);});运行model目录下的nodetask.js,一切OK,没有报错,然后运行app目录下的nodemodel/task.js,然后非常果断的报错:那么问题就真的来了。根据上面的理论,在app下运行时,../lib/common.js会被转换为/Users/guo/Sites/learn/lib/common.js,这个路径显然不存在,但是可以从运行结果看require('../lib/common')是可以的,但是readFile报错了。那么关于./的正确结论是:require()中的使用和__dirname的作用是一样的,不会因为启动脚本的目录不同而改变。在其他情况下,它与process.cwd()具有相同的效果,它是相对于启动脚本所在目录的路径。3、总结:只在require()中使用相对路径(./,../),其他地方使用绝对路径,如下://path.dirname(__filename)+'/test.js';//path.resolve(__dirname,'../lib/common.js');
