浅析 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分页类代码分享
Jun 17 NodeJs
初始Nodejs
Nov 08 NodeJs
windows下安装nodejs及框架express
Aug 07 NodeJs
初识NodeJS服务端开发入门(Express+MySQL)
Apr 07 NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 NodeJs
nodejs个人博客开发第三步 载入页面
Apr 12 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
nodejs搭建本地服务器轻松解决跨域问题
Mar 21 NodeJs
对mac下nodejs 更新到最新版本的最新方法(推荐)
May 17 NodeJs
nodejs基础之多进程实例详解
Dec 27 NodeJs
nodejs中request库使用HTTPS代理的方法
Apr 30 NodeJs
nodejs实现UDP组播示例方法
Nov 04 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
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
2013/06/01 PHP
ThinkPHP自动完成中使用函数与回调方法实例
2014/11/29 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
php格式文件打开的四种方法
2018/02/24 PHP
PHP经典设计模式之依赖注入定义与用法详解
2019/05/21 PHP
脚本吧 - 幻宇工作室用到js,超强推荐base.js
2006/12/23 Javascript
W3C Group的JavaScript1.8 新特性介绍
2009/05/19 Javascript
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
基于jquery的滚动条滚动固定div(附演示下载)
2012/10/29 Javascript
js点击选择文本的方法
2015/02/09 Javascript
js获取form的方法
2015/05/06 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
jquery获取复选框checkbox的值的简单实现方法
2016/05/26 Javascript
vue.js指令v-for使用及索引获取
2016/11/03 Javascript
vue实现点击出现操作弹出框的示例
2020/11/05 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
2020/12/11 Vue.js
vue 页面跳转的实现方式
2021/01/12 Vue.js
深入理解Python中各种方法的运作原理
2015/06/15 Python
python从入门到精通(DAY 3)
2015/12/20 Python
python3中int(整型)的使用教程
2017/03/23 Python
详解python-图像处理(映射变换)
2019/03/22 Python
pytorch-神经网络拟合曲线实例
2020/01/15 Python
Python class的继承方法代码实例
2020/02/14 Python
Python常用数据分析模块原理解析
2020/07/20 Python
Django+Uwsgi+Nginx如何实现生产环境部署
2020/07/31 Python
Python应用自动化部署工具Fabric原理及使用解析
2020/11/30 Python
英国领先的杂志订阅网站:Magazine.co.uk
2018/01/25 全球购物
室内设计自我鉴定
2013/10/15 职场文书
竞选劳动委员演讲稿
2014/04/28 职场文书
充分就业社区汇报材料
2014/05/07 职场文书
企业文化标语大全
2014/06/10 职场文书
教师一帮一活动总结
2014/07/08 职场文书
Python实战之疫苗研发情况可视化
2021/05/18 Python
MySQL transaction事务安全示例讲解
2022/06/21 MySQL
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS