浅析 NodeJs 的几种文件路径

 更新时间:2017年06月07日 09:15:35   作者:青天诀  
本篇文章主要介绍了浅析 NodeJs 的几种文件路径,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

一、挖坑 & 掉坑:

缘起一段这样的代码:

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'); 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • node.js如何自定义实现一个EventEmitter

    node.js如何自定义实现一个EventEmitter

    我们了解到,Node采用了事件驱动机制,而EventEmitter就是Node实现事件驱动的基础,本文主要介绍了node.js自定义实现EventEmitter,感兴趣的可以了解一下
    2021-07-07
  • 详解Nodejs 通过 fs.createWriteStream 保存文件

    详解Nodejs 通过 fs.createWriteStream 保存文件

    本篇文章主要介绍了Nodejs 通过 fs.createWriteStream 保存文件,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • node.js命令行教程图文详解

    node.js命令行教程图文详解

    本文先介绍原生的node.js实现命令行交互,了解原生的api,然后通过commander.js和inquirer.js实现一个完整的交互命令行工具。感兴趣的朋友跟随小编一起看看吧
    2019-05-05
  • 如何使用Node.js爬取任意网页资源并输出PDF文件到本地

    如何使用Node.js爬取任意网页资源并输出PDF文件到本地

    这篇文章主要介绍了使用Node.js爬取任意网页资源并输出高质量PDF文件到本地,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面小编就来和大家一起学习吧
    2019-06-06
  • node.js配置Token验证的2种方式总结

    node.js配置Token验证的2种方式总结

    token验证,在设计登录注册和一些权限接口时发挥作用,下面这篇文章主要给大家介绍了关于node.js配置Token验证的2种方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • nodejs判断文件、文件夹是否存在及删除的方法

    nodejs判断文件、文件夹是否存在及删除的方法

    这篇文章主要介绍了nodejs判断文件、文件夹是否存在及删除的方法,结合实例形式分析了nodejs基于文件模块针对文件与文件夹的存在判断、删除等操作技巧,需要的朋友可以参考下
    2017-11-11
  • Node.js API详解之 assert模块用法实例分析

    Node.js API详解之 assert模块用法实例分析

    这篇文章主要介绍了Node.js API详解之 assert模块用法,结合实例形式分析了Node.js API中assert模块基本函数、功能、用法及操作注意事项,需要的朋友可以参考下
    2020-05-05
  • node指定内存上限简单代码实例

    node指定内存上限简单代码实例

    NodeJS启动的应用,内存使用是有上限的,下面这篇文章主要给大家介绍了关于node指定内存上限的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • 解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题

    解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题

    这篇文章主要介绍了解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306报错的相关资料,文中将问题描述的很清楚,解决的方法也介绍的很完整,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-03-03
  • node实现简单的反向代理服务器

    node实现简单的反向代理服务器

    本篇文章主要介绍了node实现简单的反向代理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07

最新评论