浅析 NodeJs 的几种文件路径


Posted in NodeJs onJune 07, 2017

一、挖坑 & 掉坑:

缘起一段这样的代码:

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');

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
nodejs批量修改文件编码格式
Jan 22 NodeJs
使用DNode实现php和nodejs之间通信的简单实例
Jul 06 NodeJs
快速掌握Node.js之Window下配置NodeJs环境
Mar 21 NodeJs
Nodejs中 npm常用命令详解
Jul 04 NodeJs
NodeJS远程代码执行
Aug 28 NodeJs
NodeJs的fs读写删除移动监听
Apr 28 NodeJs
nodejs动态创建二维码的方法
Aug 12 NodeJs
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
Sep 06 NodeJs
nodejs 使用http进行post或get请求的实例(携带cookie)
Jan 03 NodeJs
NodeJs实现简易WEB上传下载服务器
Aug 10 NodeJs
nodejs实现聊天机器人功能
Sep 19 NodeJs
NodeJS有难度的面试题(能答对几个)
Oct 09 NodeJs
nodejs mysql 实现分页的方法
Jun 06 #NodeJs
nodejs利用ajax实现网页无刷新上传图片实例代码
Jun 06 #NodeJs
ajax +NodeJS 实现图片上传实例
Jun 06 #NodeJs
详解Nodejs之静态资源处理
Jun 05 #NodeJs
nodejs集成sqlite使用示例
Jun 05 #NodeJs
详解nodeJS之二进制buffer对象
Jun 03 #NodeJs
深入理解Nodejs Global 模块
Jun 03 #NodeJs
You might like
基于mysql的论坛(6)
2006/10/09 PHP
转PHP手册及PHP编程标准
2006/12/17 PHP
PHP模板引擎Smarty内建函数section,sectionelse用法详解
2016/04/11 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
showModelessDialog()使用详解
2006/09/21 Javascript
WordPress JQuery处理沙发头像
2009/06/22 Javascript
jQuery 动态酷效果实现总结
2009/12/27 Javascript
Javascript 匿名函数及其代码模式原理
2010/03/19 Javascript
jQuery1.6 类型判断实现代码
2011/09/01 Javascript
(跨浏览器基础事件/浏览器检测/判断浏览器)经验代码分享
2013/01/24 Javascript
jquery form 隐藏的input 选择
2014/04/29 Javascript
通过url查找a元素应用案例
2014/04/29 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
2015/09/04 Javascript
switch语句的妙用(必看篇)
2016/10/03 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
2017/02/08 Javascript
最实用的JS数组函数整理
2017/12/05 Javascript
JavaScript学习笔记之DOM操作实例分析
2019/01/08 Javascript
js实现移动端tab切换时下划线滑动效果
2019/09/08 Javascript
微信小程序如何实现点击图片放大功能
2020/01/21 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
原生js拖拽功能制作滑动条实例代码
2021/02/05 Javascript
[01:10:49]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
非递归的输出1-N的全排列实例(推荐)
2017/04/11 Python
numpy基础教程之np.linalg
2019/02/12 Python
python tkinter之 复选、文本、下拉的实现
2020/03/04 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
利用python查看数组中的所有元素是否相同
2021/01/08 Python
农村面貌改造提升实施方案
2014/03/18 职场文书
学校安全生产承诺书
2014/05/23 职场文书
销售求职信范文
2014/05/26 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
小学学习委员竞选稿
2015/11/20 职场文书
JavaScript严格模式不支持八进制的问题讲解
2021/11/07 Javascript
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers
Python函数对象与闭包函数
2022/04/13 Python
MySQL池化框架学习接池自定义
2022/07/23 MySQL