浅析 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的前后端分离的思考与实践(三)轻量级的接口配置建模框架
Sep 26 NodeJs
Windows系统下使用Sublime搭建nodejs环境
Apr 13 NodeJs
浅谈NodeJS中require路径问题
May 07 NodeJs
Nodejs从有门道无门菜鸟起飞必看教程
Jul 20 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 NodeJs
nodejs读取并去重excel文件
Apr 22 NodeJs
nodejs中express入门和基础知识点学习
Sep 13 NodeJs
手把手教你如何使用nodejs编写cli命令行
Nov 05 NodeJs
详解从NodeJS搭建中间层再谈前后端分离
Nov 13 NodeJs
Nodejs中获取当前函数被调用的行数及文件名详解
Dec 12 NodeJs
Nodejs对postgresql基本操作的封装方法
Feb 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 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
PHP将session信息存储到数据库的类实例
2015/03/04 PHP
php邮件发送的两种方式
2020/04/28 PHP
原型方法的不同写法居然会影响调试的解决方法
2007/03/08 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
2014/04/16 Javascript
Nodejs Post请求报socket hang up错误的解决办法
2014/09/25 NodeJs
JavaScript包装对象使用详解
2015/07/09 Javascript
jquery实现全屏滚动
2015/12/28 Javascript
在JavaScript中对HTML进行反转义详解
2016/05/18 Javascript
JavaScript鼠标事件,点击鼠标右键,弹出div的简单实例
2016/08/03 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
2016/09/13 Javascript
Node.js测试中的Mock文件系统详解
2016/11/21 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
JS加密插件CryptoJS实现的DES加密示例
2018/08/16 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
jquery实现选项卡切换代码实例
2019/05/14 jQuery
HTML+JavaScript实现扫雷小游戏
2019/09/30 Javascript
JavaScript事件概念详解(区分静态注册和动态注册)
2021/02/05 Javascript
[01:03:09]完美世界DOTA2联赛PWL S2 Forest vs SZ 第二场 11.25
2020/11/26 DOTA
50行代码实现贪吃蛇(具体思路及代码)
2013/04/27 Python
12步入门Python中的decorator装饰器使用方法
2016/06/20 Python
python解析html提取数据,并生成word文档实例解析
2018/01/22 Python
完美解决安装完tensorflow后pip无法使用的问题
2018/06/11 Python
深入浅析Python2.x和3.x版本的主要区别
2018/11/30 Python
Python功能点实现:函数级/代码块级计时器
2019/01/02 Python
HTML的form表单和django的form表单
2019/07/25 Python
python科学计算之narray对象用法
2019/11/25 Python
python实现每天自动签到领积分的示例代码
2020/08/18 Python
python cookie反爬处理的实现
2020/11/01 Python
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
廉价连衣裙和婚纱礼服在线销售:Tbdress
2019/02/28 全球购物
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
.net工程师笔试题
2012/06/09 面试题
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python