浅析 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的调试方法
Dec 11 NodeJs
Nodejs多站点切换Htpps协议详解及简单实例
Feb 23 NodeJs
nodejs中模块定义实例详解
Mar 18 NodeJs
nodejs中向HTTP响应传送进程的输出
Mar 19 NodeJs
NodeJs安装npm包一直失败的解决方法
Apr 28 NodeJs
nodejs socket实现的服务端和客户端功能示例
Jun 02 NodeJs
nodejs+express搭建多人聊天室步骤
Feb 12 NodeJs
nodejs 日志模块winston的使用方法
May 02 NodeJs
webpack打包nodejs项目的方法
Sep 26 NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 NodeJs
NodeJs生成sitemap站点地图的方法示例
Jun 11 NodeJs
Node.js实现爬取网站图片的示例代码
Apr 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
德生PL330测评
2021/03/02 无线电
PHP语言中global和$GLOBALS[]的分析 之二
2012/02/02 PHP
基于jquery的jqDnR拖拽溢出的修改
2011/02/12 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
动态加载JS文件的三种方法
2013/11/08 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
2015/08/27 Javascript
总结JavaScript设计模式编程中的享元模式使用
2016/05/21 Javascript
JS双击变input框批量修改内容
2016/12/12 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
2017/01/04 Javascript
node.js发送邮件email的方法详解
2017/01/06 Javascript
js中new一个对象的过程
2017/02/20 Javascript
值得分享和收藏的xmlplus组件学习教程
2017/05/05 Javascript
react-native 封装选择弹出框示例(试用ios&android)
2017/07/11 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
Express之托管静态文件的方法
2018/06/01 Javascript
Angularjs中date过滤器失效的问题及解决方法
2018/07/06 Javascript
js实现省级联动(数据结构优化)
2020/07/17 Javascript
vue实现图片裁剪后上传
2020/12/16 Vue.js
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
Python2.5/2.6实用教程 入门基础篇
2009/11/29 Python
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
2014/06/18 Python
Python version 2.7 required, which was not found in the registry
2014/08/26 Python
python实现颜色rgb和hex相互转换的函数
2015/03/19 Python
分析Python的Django框架的运行方式及处理流程
2015/04/08 Python
python统计文本字符串里单词出现频率的方法
2015/05/26 Python
Python爬虫beautifulsoup4常用的解析方法总结
2019/02/25 Python
用Python从0开始实现一个中文拼音输入法的思路详解
2019/07/20 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
python实现实时视频流播放代码实例
2020/01/11 Python
jupyter notebook 实现matplotlib图动态刷新
2020/04/22 Python
京东港澳售:京东直邮港澳台
2018/01/31 全球购物
C#笔试题集合
2013/06/21 面试题
测绘工程系学生的自我评价
2013/11/30 职场文书
情况说明书格式范文
2014/05/06 职场文书
建筑施工安全责任书
2014/07/24 职场文书