浅析 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(二)--- Node.js事件模块
May 21 NodeJs
浅析Nodejs npm常用命令
Jun 14 NodeJs
nodejs搭建本地服务器并访问文件的方法
Mar 03 NodeJs
nodejs+express实现文件上传下载管理网站
Mar 15 NodeJs
nodejs个人博客开发第二步 入口文件
Apr 12 NodeJs
nodejs处理图片的中间件node-images详解
May 08 NodeJs
webpack打包nodejs项目的方法
Sep 26 NodeJs
Nodejs中获取当前函数被调用的行数及文件名详解
Dec 12 NodeJs
nodejs微信开发之接入指南
Mar 17 NodeJs
图解NodeJS实现登录注册功能
Sep 16 NodeJs
如何利用nodejs实现命令行游戏
Nov 24 NodeJs
Nodejs实现微信分账的示例代码
Jan 19 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
上海牌131型七灯四波段四喇叭一级收音机
2021/03/02 无线电
Session保存到数据库的php类分享
2011/10/24 PHP
PHP页面中文乱码分析
2013/10/29 PHP
深入浅出php socket编程
2015/05/13 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
PHP中rename()函数的妙用讲解
2019/02/28 PHP
js资料toString 方法
2007/03/13 Javascript
javascript document.referrer 用法
2009/04/30 Javascript
jquery插件之信息弹出框showInfoDialog(成功/错误/警告/通知/背景遮罩)
2013/01/09 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
2013/05/13 Javascript
JavaScript判断浏览器类型的方法
2015/02/10 Javascript
js实现简单的可切换选项卡效果
2015/04/10 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
2016/07/09 Javascript
Jquery调用iframe父页面中的元素及方法
2016/08/23 Javascript
JS仿淘宝搜索框用户输入事件的实现
2017/06/19 Javascript
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
js判断密码强度的方法
2020/03/18 Javascript
[07:09]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant 选手采访
2021/03/11 DOTA
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
python同时给两个收件人发送邮件的方法
2015/04/30 Python
Python 通过URL打开图片实例详解
2017/06/01 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
Python之列表的插入&替换修改方法
2018/06/28 Python
解决python os.mkdir创建目录失败的问题
2018/10/16 Python
详解Python_shutil模块
2019/03/15 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
详解selenium + chromedriver 被反爬的解决方法
2020/10/28 Python
html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
2020/07/20 HTML / CSS
好军嫂事迹材料
2014/01/15 职场文书
大学生通用个人的自我评价
2014/02/10 职场文书
婚礼男方父母答谢词
2015/09/29 职场文书
2016优秀毕业生个人事迹材料
2016/02/29 职场文书