一、挖坑 & 掉坑:
缘起一段这样的代码:

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
/Users/guo/Sites/learn/app/model/task.js
/Users/guo/Sites/learn/app/model
/Users/guo/Sites/learn/app/model

然后在 app 目录下运行 node model/task.js,得到的输出是:

/Users/guo/Sites/learn/app/model
/Users/guo/Sites/learn/app/model/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 的几种文件路径相关推荐

  1. 浅析 NodeJs 的几种文件路径

    Node 中的文件路径大概有 __dirname, __filename, process.cwd(), ./ 或者 ../,前三个都是绝对路径,为了便于比较,./ 和 ../ 我们通过 path.r ...

  2. nodejs 当前文件路径_NodeJs的几种文件路径

    上次写删除文件夹的时候用到了fs模块,也集中用到了很多种路径,当时就想写一下,在Node中使用各种路径的问题,于是就简单写了一下,可以从 这里 获取demo源代码. 刚写Node的时候经常会遇到这种情 ...

  3. js已知文件路径得到file对象_NodeJs 的几种文件路径

    Node 中的文件路径大概有 __dirname, __filename, process.cwd(), ./ 或者 ../,前三个都是绝对路径,为了便于比较,./ 和 ../ 我们通过 path.r ...

  4. nodejs中的读取文件fs与文件路径path

    什么是nodejs? Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,nodejs允许javascript代码运行在服务端 1. nodejs不是一门新的编程语 ...

  5. 如何读取resources目录下的文件路径(九种方式)

    前情提要 本文中提供了九种方式获取resources目录下文件的方式.其中打印文件的方法如下: /*** 根据文件路径读取文件内容** @param fileInPath* @throws IOExc ...

  6. java 运行os文件路径_Java获取文件路径的几种方式

    关于绝对路径和相对路径: 绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:xyz est.txt 代表了test.txt文件的绝对路径. http://www.su ...

  7. 四种方法获取可执行程序的文件路径(.NET Core / .NET Framework)

    本文介绍四种不同的获取可执行程序文件路径的方法.适用于 .NET Core 以及 .NET Framework. 本文内容 使用程序集信息获取 使用应用程序域信息获取 使用进程信息获取 使用命令行参数 ...

  8. python正确读取文件路径的三种解决方法

    目录 一.问题需求 二.问题原因 三.解决办法 四.小思 一.问题需求 日常用程序读取文件数据等时,常常会显示一些诸如文件路径不存在等错误信息. 二.问题原因 这类问题,在python中,主要是由于 ...

  9. java 输出文件到mac路径_Java 中几种获取文件路径的方式

    原标题:Java 中几种获取文件路径的方式 1. 前言 Java开发中我们经常要获取文件的路径,比如读取配置文件等等.今天我们就关于文件的路径和如何读取文件简单地探讨一下. 2. 文件的路径 文件的路 ...

最新文章

  1. iOS10 推送必看 UNNotificationContentExtension
  2. PCB模拟地和数字地的处理
  3. SQL注入语法类型——报错注入
  4. 5界面怎么做窗帘拉动的效果_别让土味窗帘毁了你的家
  5. 《C++ Primer》7.2.1节练习
  6. poj1703Find them, Catch them(并查集以及路径压缩)
  7. oracle liunx 6.5安装目录,linux redhat 6.5 多路径配置
  8. 使用JdbcTemplate报 Incorrect column count: expected 1, actual 5错误解决
  9. bat怎么发起网络请求_因为一个跨域请求,我差点丢了饭碗
  10. 【转载】线段树 区间合并 小结
  11. mac osx 系统 brew install hadoop 安装指南
  12. 常见NoSQL数据库概述
  13. 关于SNIP NTRIP Caster学习笔记
  14. oracle 终止imp,终止imp/exp和expdp/impdp进程运行的方法
  15. 百度杀毒+7654联盟
  16. 如何远程访问 Redis
  17. 局域网内远程控制开机工具NetWaker
  18. 曙光服务器安装centOS8
  19. 洪荒:不周山上的绝世大能(二)
  20. 360加固宝加固应用后,出现java.lang.ClassNotFoundException异常

热门文章

  1. C#的网络适配器操作
  2. webApp移动开发之REM
  3. cgroup介绍、安装和控制cpu,内存,io示例
  4. 程序员之路,蛇年快加速!
  5. querySelector querySelectorAll
  6. mysql主从复制实战
  7. linux下重命名脚本推荐
  8. redis3.2安装过程分享
  9. [异常解决] ubuntukylin16.04 LTS中关于flash安装和使用不了的问题解决
  10. 提高云计算中的软件质量