Nodejs中提供了几种处理路径的方式,包括:

  • __dirname
  • __filename
  • process.cwd()
  • ./
  • ../

笼统的说前三种代表了绝对路径,后两种为相对路径。其中究竟有什么区别,通过下面的例子给出答案。

文件结构:

1
2
3
4
5
6
app

-- lib
common.js
-- model
test.js

test.js

1
2
3
4
5
var path = require('path');
console.log(__dirname);
console.log(__filename);
console.log(process.cwd());
console.log(path.resolve('./'));

其中path.resolve将相对路径转换为绝对路径。

第一种情况:

启动目录为:E:\github\node-file-test\app\model 命令: node test.js

结果:

1
2
3
4
__dirname:           E:\github\node-file-test\app\model
__filename: E:\github\node-file-test\app\model\test.js
process.cwd(): E:\github\node-file-test\app\model
path.resolve('./'): E:\github\node-file-test\app\model

第二种情况:

启动目录为:E:\github\node-file-test\app 命令: node model/test.js

结果:

1
2
3
4
__dirname:           E:\github\node-file-test\app\model
__filename: E:\github\node-file-test\app\model\test.js
process.cwd(): E:\github\node-file-test\app
path.resolve('./'): E:\github\node-file-test\app

总结:

  • __dirname 指向被执行文件所在文件夹的绝对路径
  • __filename 指向被执行文件的绝对路径
  • process.cwd() 指向当前程序所在的执行目录的绝对路径
  • path.resolve(‘./‘) 指向当前程序所在执行目录的绝对路径

可能会出现的问题:

在Nodejs中使用相对路径时应注意,不同地方使用相对路径因为处理相对路径的机制不同,所以可能会导致文件找不到的情况。

一、在require()中使用相对路径,此时按照Commonjs规范的规则进行寻址。如文件路径为'./test',则根据test的父模块确定其绝对路径并按照Commonjs规范的规则去寻找该文件,详情见require的基本用法

二、除require外的地方使用了相对路径,如使用了fs模块的API,并使用了相对路径。如:

1
2
3
4
5
6
7
var fs = require('fs');
var common = require('../lib/common');

fs.readFile('../lib/common.js', function (err, data) {
if (err) return console.log(err);
console.log(data);
});

此时路径按照程序启动目录为基准去寻找该文件,如果程序启动目录的路径发生变化,很有可能发生文件找不到的情况。在这种情况下应尽量使用绝对路径的方式,如:path.resolve(__dirname,'../lib/common.js')的方式去寻找该文件。这样就能保证以当前目录为基准去拼接绝对路径,而不是与程序启动目录相关联。