浅析 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 相关文章推荐
基于promise.js实现nodejs的promises库
Jul 06 NodeJs
使用DNode实现php和nodejs之间通信的简单实例
Jul 06 NodeJs
基于Nodejs利用socket.io实现多人聊天室
Feb 22 NodeJs
Nodejs基于LRU算法实现的缓存处理操作示例
Mar 17 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
详解nodeJS之二进制buffer对象
Jun 03 NodeJs
nodejs实现大文件(在线视频)的读取
Oct 16 NodeJs
nodejs高大上的部署方式(PM2)
Sep 11 NodeJs
nodejs对项目下所有空文件夹创建gitkeep的方法
Aug 02 NodeJs
Nodejs libuv运行原理详解
Aug 21 NodeJs
nodejs开发一个最简单的web服务器实例讲解
Jan 02 NodeJs
nodeJs的安装与npm全局环境变量的配置详解
Jan 06 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
世界收音机发展史
2021/03/01 无线电
PHP中static关键字原理的学习研究分析
2011/07/18 PHP
完美实现wordpress禁止文章修订和自动保存的方法
2014/11/03 PHP
php中mail函数发送邮件失败的解决方法
2014/12/24 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
启用Csrf后POST数据时出现的400错误
2015/07/05 PHP
Symfony的安装和配置方法
2016/03/17 PHP
Laravel向公共模板赋值方法总结
2019/06/25 PHP
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
有关于eclipse配置spket需要注意的一些地方
2013/04/07 Javascript
纯JS实现五子棋游戏兼容各浏览器(附源码)
2013/04/24 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
2014/03/12 Javascript
node.js中的events.emitter.once方法使用说明
2014/12/10 Javascript
javascript实现日期格式转换
2014/12/16 Javascript
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
关于react中组件通信的几种方式详解
2017/12/10 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
jQuery插件实现弹性运动完整示例
2018/07/07 jQuery
小程序scroll-view组件实现滚动的示例代码
2018/09/20 Javascript
vue项目中引入vue-datepicker插件的详解
2019/05/14 Javascript
socket在egg中的使用实例代码详解
2019/05/30 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
Python实现发送email的几种常用方法
2014/08/18 Python
基于Python 装饰器装饰类中的方法实例
2018/04/21 Python
Python Pandas数据中对时间的操作
2019/07/30 Python
Python如何进行时间处理
2020/08/06 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
2020/11/17 Python
html5 canvas 使用示例
2010/10/22 HTML / CSS
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
2016/08/18 面试题
团结就是力量演讲稿
2014/05/21 职场文书
船舶工程技术专业求职信
2014/08/07 职场文书
2015新学期家长寄语
2015/02/26 职场文书
2015秋季开学典礼致辞
2015/07/16 职场文书
Go各时间字符串使用解析
2021/04/02 Golang