内容简介:node中路径在很多地方都有使用,基础到不起眼。但有时候就是不起眼的东西,会在你不轻易间跳出来给你上一课。想起来复习一下文件路径的起因,是因为最近整理了一下项目结构,调整了目录。这也是基于对现代IDE的信任(都是IDE给惯的病),IDE会处理好路径问题,所以我只管拖动,他负责善后。可是没想到啊,我尽然忘了他不会处理于是在代码运行了两天后,发现怎么
node中路径在很多地方都有使用,基础到不起眼。但有时候就是不起眼的东西,会在你不轻易间跳出来给你上一课。
想起来复习一下文件路径的起因,是因为最近整理了一下项目结构,调整了目录。这也是基于对现代IDE的信任(都是IDE给惯的病),IDE会处理好路径问题,所以我只管拖动,他负责善后。可是没想到啊,我尽然忘了他不会处理 path.join(__dirname, '/../logs/')
这种方式的路径。
于是在代码运行了两天后,发现怎么 project/logs
的里面的日志停更了两天,是拖更吗?这不行啊,我得催催更。
这才发现 logger
中间件的目录也变了,但是处理的路径不对, logs
也没有拖更,只是另寻他处了。
log4js.configure({ appenders: { console: { type: 'console' }, koa: { type: 'dateFile', filename: path.join(__dirname, '/../logs/'), // 问题出在我身上 pattern: 'yyyy-MM-dd.log', alwaysIncludePattern: true } }, categories: { default: { appenders: ['console', 'koa'], level: 'debug' } } }); 复制代码
那肛肛好复习一下文件路径吧。
复习
概念
node中分为 相对路径 和 绝对路径 两种,相对路径表示当前目录层级相对于目标的位置,而绝对路径表示目标当前所在的位置。
相对路径:
-
./
当前目录,../
上层目录,...
绝对路径
-
__dirname
被执行的js
所在 目录 的绝对路径 -
__filename
被执行的js
的绝对路径 -
process.cwd()
当前node
命令执行时所在的文件夹的绝对路径
-
path.join([...paths])
使用平台特定的分隔符把所有path
片段连接到一起,并规范化生成的路径 -
path.resolve([...paths])
将路径或路径片段的序列处理成绝对路径。指定的路径序列是从右往左开始处理的,后面的path
被依次处理,直到构造完绝对路径。 例如,指定的路径片段序列为:/foo、/bar、baz
,则调用path.resolve('/foo', '/bar', 'baz')
会返回/bar/baz
// join path.join('/foo', 'bar', 'baz/asdf', 'quux', '..'); // 返回: '/foo/bar/baz/asdf' path.join('foo', {}, 'bar'); // 抛出 'TypeError: Path must be a string. Received {}' // resolve path.resolve('/foo/bar', './baz'); // 返回: '/foo/bar/baz' path.resolve('/foo/bar', '/tmp/file/'); // 返回: '/tmp/file' path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif'); // 如果当前工作目录是 /home/myself/node,则返回 '/home/myself/node/wwwroot/static_files/gif/image.gif'。 复制代码
示例
在 logger.js
的文件里写下如下代码:
// 所在:/Users/simon/workspace/Inspiration/FitNoteServer/src/util/logger.js console.log(__dirname); console.log(process.cwd()); console.log(__filename); console.log('----------------------'); console.log(path.join(__dirname, '/')); console.log(path.join(__dirname, '../logs/')); console.log(path.join(__dirname, '../../logs')); console.log('----------------------'); console.log(path.resolve(__dirname, '/')); console.log(path.resolve(__dirname, '../logs/')); console.log(path.resolve(__dirname, '../../logs')); 复制代码
然后分别在不同目录下启动项目:
# workspace/Inspiration/FitNoteServer ▶ node src/index.js /Users/simon/workspace/Inspiration/FitNoteServer/src/util /Users/simon/workspace/Inspiration/FitNoteServer /Users/simon/workspace/Inspiration/FitNoteServer/src/util/logger.js ---------------------- /Users/simon/workspace/Inspiration/FitNoteServer/src/util/ /Users/simon/workspace/Inspiration/FitNoteServer/src/logs/ /Users/simon/workspace/Inspiration/FitNoteServer/logs ---------------------- / /Users/simon/workspace/Inspiration/FitNoteServer/src/logs /Users/simon/workspace/Inspiration/FitNoteServer/logs # Inspiration/FitNoteServer/src ▶ node index.js /Users/simon/workspace/Inspiration/FitNoteServer/src/util /Users/simon/workspace/Inspiration/FitNoteServer/src /Users/simon/workspace/Inspiration/FitNoteServer/src/util/logger.js ---------------------- /Users/simon/workspace/Inspiration/FitNoteServer/src/util/ /Users/simon/workspace/Inspiration/FitNoteServer/src/logs/ /Users/simon/workspace/Inspiration/FitNoteServer/logs ---------------------- / /Users/simon/workspace/Inspiration/FitNoteServer/src/logs /Users/simon/workspace/Inspiration/FitNoteServer/logs 复制代码
重点
上面两个代码片段可以清楚的看到 node
执行目录不同对相对路径的影响,相对路径 ./
跟 process.cwd()
相同,都是当前 node
命令执行时所在的文件夹的绝对路径。
而 node
中,使用 require
时可以忽略这点,你可以在 require
中使用相对路径,但是在其他的地方都需要使用绝对路径。因为 require
内部的路径始终相对于你调用它的文件,它与你的工作目录无关。
总结
在项目中要格外注意相对路径与绝对路径,除了 require()
其他地方路径都要使用绝对路径。
而绝对路径要注意 path.join
与 path.resolve
的区别,同时注意项目启动时 node
执行的位置。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 深入解析Java绝对路径与相对路径
- C#/.NET 如何确认一个路径是否是合法的文件路径
- 活动精彩回顾|GopherChina 2019干货回顾!
- GAC 与其物理路径
- 关键渲染路径优化
- 【Leetcode】62. 不同路径
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。