浅析 NodeJs 的几种文件路径
来源:互联网 发布:数据公司干什么的 编辑:程序博客网 时间:2024/06/16 04:00
一、挖坑 & 掉坑:
缘起一段这样的代码:
fs.readFile('./docs/use.md', function (err, buffer) { if (err) { return console.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 里编写如下的代码:
var path = require('path');console.log(__dirname);console.log(__filename);console.log(process.cwd());console.log(path.resolve('./'));
在 model 目录下运行 node task.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 目录下运行 node model/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’ 里的代码改成:
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);});
在 model 目录下运行 node task.js,一切 Ok,没有报错。然后在 app 目录下运行 node model/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’);
四、参考链接:
What is the difference between __dirname and ./ in node.js
nodejs API
以上:smile:。
- 浅析 NodeJs 的几种文件路径
- NodeJS的文件引用路径
- 获得文件路径的几种方法
- 获得文件路径的几种方法
- iOS 获取文件的目录路径的几种方法
- iOS 获取文件的目录路径的几种方法
- iOS 获取文件的目录路径的几种方法
- iOS 获取文件的目录路径的几种方法
- iOS 获取文件的目录路径的几种方法
- iOS 获取文件的目录路径的几种方法
- iOS 获取文件的目录路径的几种方法
- Java读取文件路径的几种方法
- C#获取文件路径的几种方法
- java中获取文件路径的几种方式
- C# 获取文件路径的几种方法
- JAVA获得文件路径的几种方式
- C#获取文件路径的几种方法
- java中获得文件路径的几种方式
- Linux中profile、bashrc、bash_profile之间的区别和联系
- mac appium环境部署
- 次时代Java编程(一):Java里的协程
- js的浅克隆和深度克隆
- java使用JXL读写Excel
- 浅析 NodeJs 的几种文件路径
- Scala学习笔记-方法和函数
- C/C++获得当前程序路径
- MarkDown试水
- Objective-C面试题(精心整理的,附答案)
- NYOJ 540 奇怪的排序
- oracle case when 用法
- html5学习 一 html5选择器与json新方法html5拖拽
- TCP协议与UDP协议的区别