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

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

(0)

相关推荐

  • Nodejs读取文件时相对路径的正确写法(使用fs模块)

    在开发Nodejs中,我们往往最常用的模块就是fs核心模块(fs.readFile)来读取文件.代码如下: 但是运行之后,并没有按照想象中一样,读取test.html文件内容,这是一个bug,坑爹的玩意,解决办法: 其实由于运行环境的不同,以上的相对路径的写法导致最后读取的位置是不同的. 正确的写法应该是使用"path.join()"的方式实现:(__dirname表示当前文件的目录名) //require 表示引包,引包就是引用自己的一个特殊功能 var http = require

  • nodejs的require模块(文件模块/核心模块)及路径介绍

    在nodejs中,模块大概可以分为核心模块和文件模块. 核心模块是被编译成二进制代码,引用的时候只需require表示符即可,如(require('net')). 文件模块,则是指js文件.json文件或者是.node文件.在引用文件模块的时候后要加上文件的路径:/.../.../xxx.js表示绝对路径../xxx.js表示相对路径(同一文件夹下的xxx.js),../表示上一级目录.如果既不加/.../.../又不加./的话,则该模块要么是核心模块,要么是从一个node_modules文件夹

  • 浅析 NodeJs 的几种文件路径

    一.挖坑 & 掉坑: 缘起一段这样的代码: fs.readFile('./docs/use.md', function (err, buffer) { if (err) { return console.log('error: ', err); } console.log('OK'); }); 本地运行时一切 OK,线上部署时却死活找不到 ./docs/use.md 这个文件,后来才发现是因为线上启动应用时不是从当前目录启动了,不过为什么启动脚本的位置也会影响这个路径呢,且往下看. 二.填坑:

  • nodejs中的读取文件fs与文件路径path解析

    目录 什么是nodejs? global模块-全局变量 fs模块 读取文件 写文件 追加文件 文件同步与异步的说明 path模块 路径操作的问题 path模块的常用方法 什么是nodejs? Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,nodejs允许javascript代码运行在服务端 1. nodejs不是一门新的编程语言,nodejs是在服务端运行javascript的运行环境 2. 运行环境:写得程序想要运行必须要有对应的运行环境 php代码必

  • Java实现读取resources目录下的文件路径的九种方式

    目录 前情提要 方式一 方式二 方式三 方式四(重要) 方式五(重要) 方式六(重要) 方式七 方式八 方式九 前情提要 本文中提供了九种方式获取resources目录下文件的方式.其中打印文件的方法如下:     /**      * 根据文件路径读取文件内容      *      * @param fileInPath      * @throws IOException      */     public static void getFileContent(Object fileIn

  • 浅析C#中文件路径的操作

    在程序中对文件操作是非常常见的,而对文件的操作则不可避免的需要文件的路径,并对文件的路径进行一系列的操作,例如:判断已知的路径是一个目录还是一个文件,路劲是一个文件则该文件的名称是什么,文件的扩展名名是什么等等.在C#中并并没有将文件的路径抽象为一个类,用来表示文件路径就是一个普通的字符串.对文件路径的操作例如,要获取文件名称,可以通过截取字符串或者使用正则表达式来取得. 其实,在.NET类库中,有一个专门的功能类System.IO.Path,对表示文件或在目录路径的string进行操作.下面介

  • nodejs 实现简单的文件上传功能(示例详解)

    首先需要大家看一下目录结构,然后开始一点开始我们的小demo. 文件上传总计分为三种方式: 1.通过flash,activeX等第三方插件实现文件上传功能. 2.通过html的form标签实现文件上传功能,优点:浏览器兼容好. 3.通过xhr level2的异步请求,可以百度formData对象. 这里使用2做个练习. node插件请看下package.json文件 { "name": "upload", "version": "0.1

  • NodeJS后端开发操作文件之读写文件

    目录 简介 创建文件夹 删除文件 删除文件夹 写入数据 读取数据 检查文件是否存在 总结 简介 操作文件是服务端一个基础的功能,也是做后端开发的必备能力之一.操作文件主要包括读和写.而这些功能 NodeJS 都已经提供了对应的方法.只要调用就行了. 创建文件夹 同步方法: const fs = require('fs') fs.mkdirSync(`${__dirname}/雷猴`) NodeJS有一个文件模块,叫fs .对文件操作的话,必须先引入这个模块. 使用fs.mkdirSync方法可以

  • Nodejs读取本地json文件,输出json数据接口方式

    目录 Nodejs读取本地json文件,输出json数据接口 第一步:准备本地JSON文件 第二步:编写nodejs服务程序 第三步: 测试请求接口数据 nodejs读取本地json文件中文乱码 第一种方式 第二种方式 Nodejs读取本地json文件,输出json数据接口 第一步:准备本地JSON文件 F:\nodejs\data\test.json {     "code": 0,     "msg": "请求成功",     "d

  • 在vs2010中,输出当前文件路径与源文件当前行号的解决方法

    看到一道题目:vs2010中,如何输出当前文件路径和源文件当前行号.不知道,于是立刻上网搜,于是找到了答案:总结一下,有用的时候就直接拿来用了,据说它们是系统预定义宏,但这种宏并不是在某个文件中定义的,而是由编译器定义的. 复制代码 代码如下: cout << __LINE__ << endl;  //输出语句所在的行号 cout << __FILE__  << endl; //输出文件名(包括路径) cout << __TIME__ <&

  • nodejs服务搭建教程 nodejs访问本地站点文件

    本教程为大家分享了nodejs服务搭建和如何访问本地站点文件,供大家参考,具体内容如下 搭建nodejs服务器步骤: 1.安装nodejs服务(从官网下载安装) 2.在自己定义的目录下新建服务器文件如 server.js 例如,我在E:\PhpProject\html5\websocket下创建了server.js文件 var http = require('http');//引入http模块 //开启服务,监听8888端口 //端口号最好为6000以上 var server = http.cr

  • 简单掌握Python中glob模块查找文件路径的用法

    glob使用UNIX shell规则查找与一个模式匹配的文件名.只要程序需要查找文件系统中名字与某个模式匹配的一组文件,就可以使用这个模块. glob的模式规则与re模块使用的正则表达式不相同.glob模式遵循标准UNIX路径扩展规则.只是用几个特殊字符来实现两个不同的通配符和字符区间.模式规则要应用于文件名中的段.模式中的路径可以是相对路径或绝对路径. shell变量名和波浪线都不会扩展. 基本用法 1.glob.glob(pathname), 返回所有匹配的文件路径列表.它只有一个参数pat

随机推荐