浅析 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实现PHP的print_r函数代码
Mar 14 NodeJs
Nodejs实现的一个简单udp广播服务器、客户端
Sep 25 NodeJs
nodejs中转换URL字符串与查询字符串详解
Nov 26 NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
nodejs学习笔记之路由
Mar 27 NodeJs
nodeJS微信分享
Dec 20 NodeJs
nodejs 如何手动实现服务器
Aug 20 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
NodeJS实现一个聊天室功能
Nov 25 NodeJs
浅谈JS和Nodejs中的事件驱动
May 05 NodeJs
分享node.js实现简单登录注册的具体代码
Apr 26 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
PHP面向对象精要总结
2014/11/07 PHP
弹出广告特效代码(一个IP只弹出一次)
2007/05/11 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
js图片预加载示例
2014/04/30 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
2016/10/25 Javascript
Bootstrap Table使用心得总结
2016/11/29 Javascript
JS实现点击拉拽轮播图pc端移动端适配
2018/09/05 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
2019/02/21 Javascript
vue实现文字加密功能
2019/09/27 Javascript
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
简单了解three.js 着色器材质
2020/08/03 Javascript
在antd Form表单中select设置初始值操作
2020/11/02 Javascript
[01:10:02]IG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python通过floor函数舍弃小数位的方法
2015/03/17 Python
Python导入txt数据到mysql的方法
2015/04/08 Python
python 采集中文乱码问题的完美解决方法
2016/09/27 Python
Python之自动获取公网IP的实例讲解
2017/10/01 Python
python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决
2019/04/29 Python
分享8个非常流行的 Python 可视化工具包
2019/06/05 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
tensorflow实现训练变量checkpoint的保存与读取
2020/02/10 Python
如何用Python 加密文件
2020/09/10 Python
CSS3,线性渐变(linear-gradient)的使用总结
2017/01/09 HTML / CSS
Canvas 文本转粒子效果的实现代码
2019/02/14 HTML / CSS
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
加拿大时尚少女服装品牌:Garage
2016/10/10 全球购物
eDreams澳大利亚:预订机票、酒店和度假产品
2017/04/19 全球购物
广州一家公司的.NET面试题
2016/06/11 面试题
实习公司领导推荐函
2014/05/21 职场文书
活动总结报告怎么写
2014/07/03 职场文书
一文搞懂python异常处理、模块与包
2021/06/26 Python
React如何创建组件
2021/06/27 Javascript
Axios代理配置及封装响应拦截处理方式
2022/04/07 Vue.js
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers