回顾Node文件路径

栏目: Node.js · 发布时间: 5年前

内容简介: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 路径

  • 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.joinpath.resolve 的区别,同时注意项目启动时 node 执行的位置。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Just My Type

Just My Type

Simon Garfield / Profile Books / 2010-10-21 / GBP 14.99

What's your type? Suddenly everyone's obsessed with fonts. Whether you're enraged by Ikea's Verdanagate, want to know what the Beach Boys have in common with easy Jet or why it's okay to like Comic Sa......一起来看看 《Just My Type》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具