浅析 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的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
Sep 26 NodeJs
windows下安装nodejs及框架express
Aug 07 NodeJs
NodeJs的优势和适合开发的程序
Aug 14 NodeJs
nodejs进阶(6)—连接MySQL数据库示例
Jan 07 NodeJs
nodejs基础应用
Feb 03 NodeJs
详解nodeJS之路径PATH模块
May 31 NodeJs
详解nodejs模板引擎制作
Jun 14 NodeJs
Nodejs之TCP服务端与客户端聊天程序详解
Jul 07 NodeJs
nodejs调取微信收货地址的方法
Dec 20 NodeJs
对mac下nodejs 更新到最新版本的最新方法(推荐)
May 17 NodeJs
NodeJS如何实现同步的方法示例
Aug 24 NodeJs
Nodejs libuv运行原理详解
Aug 21 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 字符串编码截取函数(兼容utf-8和gb2312)
2009/05/02 PHP
使用VisualStudio开发php的图文设置方法
2010/08/21 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
浅析php中json_encode()和json_decode()
2014/05/25 PHP
php curl登陆qq后获取用户信息时证书错误
2015/02/03 PHP
php实现可运算的验证码
2015/11/10 PHP
YII Framework框架教程之日志用法详解
2016/03/14 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
2018/05/02 PHP
YII2框架中actions的作用与使用方法示例
2020/03/13 PHP
document.all与WEB标准
2020/05/13 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
全面解析Bootstrap中transition、affix的使用方法
2016/05/30 Javascript
jquery网页日历显示控件calendar3.1使用详解
2016/11/24 Javascript
vue 项目build错误异常的解决方法
2019/04/22 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
[01:39:04]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第二场 2月1日
2021/03/11 DOTA
Python解析nginx日志文件
2015/05/11 Python
python实现判断数组是否包含指定元素的方法
2015/07/15 Python
python的re正则表达式实例代码
2018/01/24 Python
opencv3/python 鼠标响应操作详解
2019/12/11 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
python 使用建议与技巧分享(四)
2020/08/18 Python
英国泽西岛植物:Jersey Plants Direct
2019/08/07 全球购物
表彰先进集体通报
2014/01/12 职场文书
施工安全标语
2014/06/07 职场文书
小学绿色学校申报材料
2014/08/23 职场文书
离婚财产处理协议书
2014/09/30 职场文书
2014年销售助理工作总结
2014/12/01 职场文书
创先争优活动个人总结
2015/03/04 职场文书
护士实习自荐信
2015/03/06 职场文书
python flask框架快速入门
2021/05/14 Python
vue如何实现关闭对话框后刷新列表
2022/04/08 Vue.js
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers
mysql拆分字符串作为查询条件的示例代码
2022/07/07 MySQL