浅析 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 相关文章推荐
快速掌握Node.js之Window下配置NodeJs环境
Mar 21 NodeJs
Nodejs高扩展性的模板引擎 functmpl简介
Feb 13 NodeJs
解析NodeJS异步I/O的实现
Apr 13 NodeJs
Nodejs之TCP服务端与客户端聊天程序详解
Jul 07 NodeJs
nodejs之get/post请求的几种方式小结
Jul 26 NodeJs
nodejs创建简易web服务器与文件读写的实例
Sep 07 NodeJs
nodejs爬虫初试superagent和cheerio
Mar 05 NodeJs
nodejs中express入门和基础知识点学习
Sep 13 NodeJs
Nodejs中使用puppeteer控制浏览器中视频播放功能
Aug 26 NodeJs
nodejs一个简单的文件服务器的创建方法
Sep 13 NodeJs
详解NodeJS模块化
Jun 15 NodeJs
浅谈Node的内存泄露问题
May 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
php 启动时报错的简单解决方法
2014/01/27 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
2017/05/30 PHP
PHP双向链表定义与用法示例
2018/01/31 PHP
PHP常量define和const的区别详解
2019/05/18 PHP
一个网页标题title的闪动提示效果实现思路
2014/03/22 Javascript
node.js中的http.response.writeHead方法使用说明
2014/12/14 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
javascript的BOM汇总
2015/07/16 Javascript
深入理解JavaScript程序中内存泄漏
2016/03/17 Javascript
基于 Node.js 实现前后端分离
2016/04/23 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
2016/10/05 Javascript
Bootstrap基本组件学习笔记之导航(10)
2016/12/07 Javascript
nodejs连接mysql数据库简单封装示例-mysql模块
2017/04/10 NodeJs
vue组件watch属性实例讲解
2017/11/07 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
uni-app如何页面传参数的几种方法总结
2020/04/28 Javascript
python写入中英文字符串到文件的方法
2015/05/06 Python
Python读取文件内容的三种常用方式及效率比较
2017/10/07 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
2018/02/08 Python
tensorflow学习笔记之mnist的卷积神经网络实例
2018/04/15 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
python提取xml里面的链接源码详解
2019/10/15 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
2020/03/18 Python
python上selenium的弹框操作实现
2020/07/13 Python
python 利用Pyinstaller打包Web项目
2020/10/23 Python
python 写一个性能测试工具(一)
2020/10/24 Python
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
婚礼证婚人证婚词
2014/01/13 职场文书
人力资源总监工作说明
2014/03/03 职场文书
党员“四风”方面存在问题及整改措施
2014/09/24 职场文书
2014年个人委托书范本
2014/10/13 职场文书
2014年人事行政工作总结
2014/12/03 职场文书
道歉情书大全
2015/05/12 职场文书
python基于opencv批量生成验证码的示例
2021/04/28 Python