浅析 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 win7下安装方法
May 24 NodeJs
Windows系统下使用Sublime搭建nodejs环境
Apr 13 NodeJs
NodeJS实现阿里大鱼短信通知发送
Jan 17 NodeJs
nodejs 的 session 简单使用
Jun 06 NodeJs
nodejs连接mongodb数据库实现增删改查
Dec 01 NodeJs
详解nodejs 文本操作模块-fs模块(三)
Dec 22 NodeJs
详解nodejs中的process进程
Mar 19 NodeJs
nodejs 最新版安装npm 的使用详解
Jan 18 NodeJs
NodeJS搭建HTTP服务器的实现步骤
Oct 12 NodeJs
nodejs基础之buffer缓冲区用法分析
Dec 26 NodeJs
PHPStorm中如何对nodejs项目进行单元测试详解
Feb 28 NodeJs
详解利用nodejs对本地json文件进行增删改查
Sep 20 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静态方法及普通方法的区别
2016/10/04 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
JavaScript高级程序设计 读书笔记之十一 内置对象Global
2012/03/07 Javascript
javascript中的绑定与解绑函数应用示例
2013/06/24 Javascript
instanceof和typeof运算符的区别详解
2014/01/06 Javascript
手机端页面rem宽度自适应脚本
2015/05/20 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
2015/09/04 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
2016/05/05 Javascript
基于jQuery ligerUI实现分页样式
2016/09/18 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
bootstrap table表格使用方法详解
2017/04/26 Javascript
详解vue slot插槽的使用方法
2017/06/13 Javascript
说说node中的可读流和可写流的区别
2018/06/01 Javascript
jQuery pagination分页示例详解
2018/10/23 jQuery
jquery实现图片放大镜效果
2020/12/23 jQuery
[45:06]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第二场 11.28
2020/12/02 DOTA
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
Python 探针的实现原理
2016/04/23 Python
python用reduce和map把字符串转为数字的方法
2016/12/19 Python
python利用dir函数查看类中所有成员函数示例代码
2017/09/08 Python
搭建python django虚拟环境完整步骤详解
2019/07/08 Python
django 使用 PIL 压缩图片的例子
2019/08/16 Python
python3中利用filter函数输出小于某个数的所有回文数实例
2019/11/24 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
详解使用HTML5的classList属性操作CSS类
2017/10/13 HTML / CSS
智能旅行箱:Horizn Studios
2018/04/30 全球购物
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
Java的for语句中break, continue和return的区别
2013/12/19 面试题
材料物理专业个人求职信
2013/12/15 职场文书
公司拓展活动方案
2014/02/13 职场文书
餐厅销售主管职责范本
2014/02/19 职场文书
信用卡工作证明范本
2015/06/19 职场文书
用python基于appium模块开发一个自动收取能量的小助手
2021/09/25 Python
Win11如何查看显卡型号 Win11查看显卡型号的方法
2022/08/14 数码科技