浅析 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极简入门教程(一):模块机制
Oct 25 NodeJs
轻松创建nodejs服务器(2):nodejs服务器的构成分析
Dec 18 NodeJs
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
Jan 01 NodeJs
Windows 系统下设置Nodejs NPM全局路径
Apr 26 NodeJs
NodeJs的优势和适合开发的程序
Aug 14 NodeJs
NodeJS和BootStrap分页效果的实现代码
Nov 07 NodeJs
angular2+nodejs实现图片上传功能
Mar 27 NodeJs
详解nodejs微信公众号开发——3.封装消息响应模块
Apr 10 NodeJs
深入理解nodejs中Express的中间件
May 19 NodeJs
Nodejs实现文件上传的示例代码
Sep 26 NodeJs
nodejs log4js 使用详解
May 31 NodeJs
图解NodeJS实现登录注册功能
Sep 16 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+Html+缓存
2006/11/25 PHP
如何突破PHP程序员的技术瓶颈分析
2011/07/17 PHP
三种php连接access数据库方法
2013/11/11 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
dojo 之基础篇(二)之从服务器读取数据
2007/03/24 Javascript
容易被忽略的JS脚本特性
2011/09/13 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
jQuery 回调函数(callback)的使用和基础
2015/02/26 Javascript
jQuery获取标签文本内容和html内容的方法
2015/03/27 Javascript
JavaScript基本语法讲解
2015/06/03 Javascript
vue router使用query和params传参的使用和区别
2017/11/13 Javascript
4个顶级开源JavaScript图表库
2018/09/29 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
Python常见数据结构详解
2014/07/24 Python
Python 列表list使用介绍
2014/11/30 Python
python 循环while和for in简单实例
2016/08/16 Python
python基于twisted框架编写简单聊天室
2018/01/02 Python
python多进程实现文件下载传输功能
2018/07/28 Python
python绘制多个子图的实例
2019/07/07 Python
python实现连连看游戏
2020/02/14 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
如何基于python实现不邻接植花
2020/05/01 Python
解决Windows下python和pip命令无法使用的问题
2020/08/31 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
Python list和str互转的实现示例
2020/11/16 Python
详解HTML5中ol标签的用法
2015/09/08 HTML / CSS
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
中医临床专业自我鉴定范文
2014/01/15 职场文书
《中彩那天》教学反思
2014/02/22 职场文书
技校学生个人职业生涯规划范文
2014/03/03 职场文书
Python实现生成bmp图像的方法
2021/06/13 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
2022/04/13 Python