目录
简介
在node.js中会在这么几种情况下跟路径打交道:
- process.cwd()
- process.execPath
- __fileName
- __dirname
- fs.readFile(path)
- require
下面我们就来一一说明
例子
目录结构
假设我们有这样一个目录结构:
主要代码
pathTest.js的内容如下:
function show(){
var fs = require("fs");
var data = require("./data.json");
console.log("process.cwd():");
console.log(process.cwd());
console.log("");
console.log("process.execPath:");
console.log(process.execPath);
console.log("");
console.log("__fileName:");
console.log(__filename);
console.log("");
console.log("__dirname:");
console.log(__dirname);
console.log("");
console.log("");
console.log("data.name:");
console.log(data.name);
try{
console.log("file:");
var content = fs.readFileSync("./main/file");
console.log(content);
} catch(e){
console.log("cannot read file: ./main/file");
}
}
show();
console.log("");
console.log("process.chdir('main')");
console.log("");
process.chdir("main")
show();
console.log("");
console.log("process.chdir('..')");
console.log("");
process.chdir("..")
show();
其他的json文件或者file就随便写点内容好了。
执行结果
通过命令行进入到/Users/jiangqifan/jstest目录,执行main/pathTest.js, 就像这样:
jiangqifandeMBP:jstest jiangqifan$ node main/pathTest.js
输出为:
process.cwd():
/Users/jiangqifan/jstest
process.execPath:
/usr/local/bin/node
__fileName:
/Users/jiangqifan/jstest/main/pathTest.js
__dirname:
/Users/jiangqifan/jstest/main
data.name:
jqf
file:
<Buffer 68 65 6c 6c 6f 57 6f 72 6c 64 2e>
process.chdir('main')
process.cwd():
/Users/jiangqifan/jstest/main
process.execPath:
/usr/local/bin/node
__fileName:
/Users/jiangqifan/jstest/main/pathTest.js
__dirname:
/Users/jiangqifan/jstest/main
data.name:
jqf
file:
cannot read file: ./main/file
process.chdir('..')
process.cwd():
/Users/jiangqifan/jstest
process.execPath:
/usr/local/bin/node
__fileName:
/Users/jiangqifan/jstest/main/pathTest.js
__dirname:
/Users/jiangqifan/jstest/main
data.name:
jqf
file:
<Buffer 68 65 6c 6c 6f 57 6f 72 6c 64 2e>
具体说明
相信聪明如你,看了上面的栗子之后就已经清楚每一种用法的情况了,不过我们还是在下面整理一下。
process.cwd()
这个方法返回的是当前进程的的当前工作目录
比如你在/Users/jiangqifan/jstest
目录执行的node
命令,那么返回的就是/Users/jiangqifan/jstest
。
通过你可以使用process.chdir(dir)
来调整process.cwd()的值。基本上就可以相当于cd
命令来理解。
process.execPath
启动当前进程的地址,就是你的node的可执行程序的地址啦。比如/usr/local/bin/node
。
__filename
这是有node提供的global对象,表示当前文件的路径。就像上面的栗子中的/Users/jiangqifan/jstest/main/pathTest.js
。
__dirname
这也是node提供的global对象,表示当前文件的目录。就像上面栗子中的/Users/jiangqifan/jstest/main
。
__filename和__dirname跟你在什么目录执行node命令跟关系,只跟当前js文件的路径有关。
fs.readFile(path)
在使用fs.readFile
或者fs.readFileSync
来读去文件的时候,如果path是绝对路径,当然没什么好说的,如果是相对路径呢,就是相对于process.cwd()
。
所以在上面的栗子中,我们通过process.chdir
改变了进程的当前工作目录之后,就会发现原来能找到的文件找不到了。
而且需要注意的是,由于process.cwd()
跟你执行node命令的路径有关。所以可能本来跑得好好的程序,后来由于懒得cd到工程目录中去,直接在外面执行就发现程序出错了。
require(path)
require使用相对路径来加载模块时,这个路径是相对于__filename,跟着当前js文件走的。