浅析 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 相关文章推荐
Windows 系统下设置Nodejs NPM全局路径
Apr 26 NodeJs
详解nodejs 文本操作模块-fs模块(一)
Dec 22 NodeJs
使用nodejs下载风景壁纸
Feb 05 NodeJs
nodejs个人博客开发第二步 入口文件
Apr 12 NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 NodeJs
nodejs 最新版安装npm 的使用详解
Jan 18 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
nodejs多版本管理总结
Apr 03 NodeJs
NodeJS如何实现同步的方法示例
Aug 24 NodeJs
nodejs搭建本地服务器并访问文件操作示例
May 11 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 define()函数及defined()函数使用详解
2013/06/09 PHP
CI框架表单验证实例详解
2016/11/21 PHP
PHP多维数组排序array详解
2017/11/21 PHP
laravel 使用auth编写登录的方法
2019/09/30 PHP
jQuery 选择器理解
2010/03/16 Javascript
jquery日历控件实现方法分享
2014/03/07 Javascript
setInterval计时器不准的问题解决方法
2014/05/08 Javascript
javascript的事件触发器介绍的实现
2014/06/05 Javascript
js实现绿白相间竖向网页百叶窗动画切换效果
2015/03/02 Javascript
js 实现一些跨浏览器的事件方法详解及实例
2016/10/27 Javascript
手把手教你使用vue-cli脚手架(图文解析)
2017/11/08 Javascript
Vue单页应用引用单独的样式文件的两种方式
2018/03/30 Javascript
ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
2018/09/25 Javascript
微信小程序云开发(数据库)详解
2019/05/17 Javascript
Vue.js实现tab切换效果
2019/07/24 Javascript
vue引用外部JS的两种种方法
2020/01/28 Javascript
[17:00]DOTA2 HEROS教学视频教你分分钟做大人-帕克
2014/06/10 DOTA
[01:34]完美“圣”典宣传片震撼发布,12.17与你不见不散
2016/12/16 DOTA
[48:35]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 TNC vs Optic
2018/04/03 DOTA
Python MySQLdb模块连接操作mysql数据库实例
2015/04/08 Python
Python操作MongoDB数据库的方法示例
2018/01/04 Python
python和opencv实现抠图
2018/07/18 Python
css3的transform中scale缩放详解
2014/12/08 HTML / CSS
CSS3 @keyframes简单动画实现
2018/02/24 HTML / CSS
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
广告学专业应届生求职信
2013/10/01 职场文书
档案接收函范文
2014/01/10 职场文书
幼儿园运动会入场词
2014/02/10 职场文书
学生会招新策划书
2014/02/14 职场文书
《晚上的太阳》教学反思
2014/04/23 职场文书
大学优秀班集体申报材料
2014/05/23 职场文书
广播节目策划方案
2014/05/23 职场文书
为自己工作观后感
2015/06/11 职场文书
高中生军训感言
2015/08/01 职场文书
Win11 引入 Windows 365 云操作系统,适应疫情期间混合办公模式:启动时直接登录、模
2022/04/06 数码科技