全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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


# NodeJs  # 文件路径  # NodeJS文件引用路径  # Nodejs读取文件时相对路径的正确写法(使用fs模块)  # nodejs的require模块(文件模块/核心模块)及路径介绍  # 都是  # 目录下  # 来了  # 是从  # 错了  # 线上  # 是因为  # 也会  # 还在  # 也没  # 找不到  # 我们可以  # 才发现  # 再来  # 不存在  # 这下  # 可以看出  # 报错  # 相对于  # 转换为 


相关文章: 宝塔Windows建站如何避免显示默认IIS页面?  如何通过WDCP绑定主域名及创建子域名站点?  建站主机如何选?性能与价格怎样平衡?  建站之星安装模板失败:服务器环境不兼容?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  网站图片在线制作软件,怎么在图片上做链接?  深入理解Android中的xmlns:tools属性  制作网站的软件免费下载,免费制作app哪个平台好?  宿州网站制作公司兴策,安徽省低保查询网站?  兔展官网 在线制作,怎样制作微信请帖?  网站制作服务平台,有什么网站可以发布本地服务信息?  建站之星安装路径如何正确选择及配置?  北京企业网站设计制作公司,北京铁路集团官方网站?  如何挑选最适合建站的高性能VPS主机?  Java解压缩zip - 解压缩多个文件或文件夹实例  如何选择高效稳定的ISP建站解决方案?  网站制作需要会哪些技术,建立一个网站要花费多少?  微课制作网站有哪些,微课网怎么进?  建站之星×万网:智能建站系统+自助建站平台一键生成  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  如何通过可视化优化提升建站效果?  linux top下的 minerd 木马清除方法  完全自定义免费建站平台:主题模板在线生成一站式服务  ,在苏州找工作,上哪个网站比较好?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  C#如何使用XPathNavigator高效查询XML  建站VPS推荐:2025年高性能服务器配置指南  如何快速搭建虚拟主机网站?新手必看指南  如何在IIS管理器中快速创建并配置网站?  宝塔新建站点报错如何解决?  行程制作网站有哪些,第三方机票电子行程单怎么开?  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  制作公司内部网站有哪些,内网如何建网站?  无锡营销型网站制作公司,无锡网选车牌流程?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  建站之星后台管理如何实现高效配置?  ,网页ppt怎么弄成自己的ppt?  南宁网站建设制作定制,南宁网站建设可以定制吗?  seo网站制作优化,网站SEO优化步骤有哪些?  金*站制作公司有哪些,金华教育集团官网?  制作销售网站教学视频,销售网站有哪些?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  如何在阿里云完成域名注册与建站?  江苏网站制作公司有哪些,江苏书法考级官方网站?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何快速生成高效建站系统源代码?  如何获取免费开源的自助建站系统源码?  如何通过主机屋免费建站教程十分钟搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。