typora-copy-images-to: media

Node核心模块

FS - 文件模块

Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。

异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。

建议大家使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。

fs.readFile() - 读取文件

语法

以下为异步模式下读取文件的语法格式:

fs.readFile(path[, options], callback)

参数

参数使用说明如下:

  • path - 文件的路径。
  • options - 该参数是一个对象,包含 {encoding, flag, signal}。默认编码为 utf8, flag 为 'w',signal允许中止正在进行的读取文件
  • callback - 回调函数,有2个参数(err, data),文件读取完成后,通过回调函数拿到读取的结果。

注意

  • 1、如果读取成功,则err的值为null
  • 2、如果读取失败,则err的值为 错误对象,data的值为 undefined

实例

const fs = require('fs');

// 读取文件
fs.readFile('./test.txt', function(err, data){
    if( err ) return console.log(err);
    console.log(data.toString());
})

注意

fs.writeFile() - 写入文件

语法

以下为异步模式下写入文件的语法格式:

fs.writeFile(file, data[, options], callback)

writeFile 直接打开文件默认是 w 模式,所以如果文件存在,该方法写入的内容会覆盖旧的文件内容。

参数

参数使用说明如下:

  • file - 文件名或文件描述符。
  • data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(缓冲) 对象。
  • options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 'w'
  • callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。

实例

接下来我们创建 file.js 文件,代码如下所示:

const fs = require("fs");

console.log("准备写入文件");
fs.writeFile('input.txt', '我是通 过fs.writeFile 写入文件的内容',  function(err) {
   if (err) {
       return console.error(err);
   }
   console.log("数据写入成功!");
   console.log("--------我是分割线-------------")
   console.log("读取写入的数据!");
   fs.readFile('input.txt', function (err, data) {
      if (err) {
         return console.error(err);
      }
      console.log("异步读取文件数据: " + data.toString());
   });
});

以上代码执行结果如下:

$ node file.js 
准备写入文件
数据写入成功!
--------我是分割线-------------
读取写入的数据!
异步读取文件数据: 我是通 过fs.writeFile 写入文件的内容

fs.open() - 打开文件

语法

以下为在异步模式下打开文件的语法格式:

fs.open(path, flags[, mode], callback)

参数

参数使用说明如下:

  • path - 文件的路径。
  • flags - 文件打开的行为。具体值详见下文。
  • mode - 设置文件模式(权限),文件创建默认权限为 0666(可读,可写)。
  • callback - 回调函数,带有两个参数如:callback(err, fd)。

flags 参数可以是以下值:

Flag 描述
r 以读取模式打开文件。如果文件不存在抛出异常。
r+ 读写模式打开文件。如果文件不存在抛出异常
rs 以同步的方式读取文件。
rs+ 以同步的方式读取和写入文件。
w 以写入模式打开文件,如果文件不存在则创建。
wx 类似 'w',但是如果文件路径存在,则文件写入失败。
w+ 读写模式打开文件,如果文件不存在则创建
wx+ 类似 'w+', 但是如果文件路径存在,则文件读写失败。
a 以追加模式打开文件,如果文件不存在则创建。
ax 类似 'a', 但是如果文件路径存在,则文件追加失败。
a+ 读取追加模式打开文件,如果文件不存在则创建
ax+ 类似 'a+', 但是如果文件路径存在,则文件读取追加失败。

实例

接下来我们创建 file.js 文件,并打开 input.txt 文件进行读写,代码如下所示:

var fs = require("fs");

// 异步打开文件
console.log("准备打开文件!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
  console.log("文件打开成功!");     
});

以上代码执行结果如下:

$ node file.js 
准备打开文件!
文件打开成功!

fs.stat() - 获取文件信息

语法

以下为通过异步模式获取文件信息的语法格式:

fs.stat(path, callback)

参数

参数使用说明如下:

  • path - 文件路径。
  • callback - 回调函数,带有两个参数如:(err, stats), statsfs.Stats 对象。

fs.stat(path)执行后,会将stats类的实例返回给其回调函数。可以通过stats类中的提供方法判断文件的相关属性。例如判断是否为文件:

var fs = require('fs');

fs.stat('/Users/liuht/code/itbilu/demo/fs.js', function (err, stats) {
    console.log(stats.isFile());         //true
})

stats类中的方法有:

方法 描述
stats.isFile() 如果是文件返回 true,否则返回 false。
stats.isDirectory() 如果是目录返回 true,否则返回 false。
stats.isBlockDevice() 如果是块设备返回 true,否则返回 false。
stats.isCharacterDevice() 如果是字符设备返回 true,否则返回 false。
stats.isSymbolicLink() 如果是软链接返回 true,否则返回 false。
stats.isFIFO() 如果是FIFO,返回true,否则返回 false。FIFO是UNIX中的一种特殊类型的命令管道。
stats.isSocket() 如果是 Socket 返回 true,否则返回 false。

实例

接下来我们创建 file.js 文件,代码如下所示:

var fs = require("fs");

console.log("准备打开文件!");
fs.stat('input.txt', function (err, stats) {
   if (err) {
       return console.error(err);
   }
   console.log(stats);
   console.log("读取文件信息成功!");
   
   // 检测文件类型
   console.log("是否为文件(isFile) ? " + stats.isFile());
   console.log("是否为目录(isDirectory) ? " + stats.isDirectory());    
});

以上代码执行结果如下:

$ node file.js 
准备打开文件!
{ dev: 16777220,
  mode: 33188,
  nlink: 1,
  uid: 501,
  gid: 20,
  rdev: 0,
  blksize: 4096,
  ino: 40333161,
  size: 61,
  blocks: 8,
  atime: Mon Sep 07 2015 17:43:55 GMT+0800 (CST),
  mtime: Mon Sep 07 2015 17:22:35 GMT+0800 (CST),
  ctime: Mon Sep 07 2015 17:22:35 GMT+0800 (CST) }
读取文件信息成功!
是否为文件(isFile) ? true
是否为目录(isDirectory) ? false

fs.read() - 读取文件

语法

以下为异步模式下读取文件的语法格式:

fs.read(fd, buffer, offset, length, position, callback)

该方法使用了文件描述符来读取文件。

参数

参数使用说明如下:

  • fd - 通过 fs.open() 方法返回的文件描述符。
  • buffer - 数据写入的缓冲区。
  • offset - 缓冲区写入的写入偏移量。
  • length - 要从文件中读取的字节数。
  • position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。
  • callback - 回调函数,有三个参数err, bytesRead, buffer,err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象。

实例

input.txt 文件内容为:

菜鸟教程官网地址:www.runoob.com

接下来我们创建 file.js 文件,代码如下所示:

var fs = require("fs");
var buf = new Buffer.alloc(1024);

console.log("准备打开已存在的文件!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
   console.log("文件打开成功!");
   console.log("准备读取文件:");
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
      if (err){
         console.log(err);
      }
      console.log(bytes + "  字节被读取");
      
      // 仅输出读取的字节
      if(bytes > 0){
         console.log(buf.slice(0, bytes).toString());
      }
   });
});

以上代码执行结果如下:

$ node file.js 
准备打开已存在的文件!
文件打开成功!
准备读取文件:
42  字节被读取
菜鸟教程官网地址:www.runoob.com

fs.close() - 关闭文件

语法

以下为异步模式下关闭文件的语法格式:

fs.close(fd, callback)

该方法使用了文件描述符来读取文件。

参数

参数使用说明如下:

  • fd - 通过 fs.open() 方法返回的文件描述符。
  • callback - 回调函数,没有参数。

实例

input.txt 文件内容为:

菜鸟教程官网地址:www.runoob.com

接下来我们创建 file.js 文件,代码如下所示:

var fs = require("fs");
var buf = new Buffer.alloc(1024);

console.log("准备打开文件!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
   console.log("文件打开成功!");
   console.log("准备读取文件!");
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
      if (err){
         console.log(err);
      }

      // 仅输出读取的字节
      if(bytes > 0){
         console.log(buf.slice(0, bytes).toString());
      }

      // 关闭文件
      fs.close(fd, function(err){
         if (err){
            console.log(err);
         } 
         console.log("文件关闭成功");
      });
   });
});

以上代码执行结果如下:

$ node file.js 
准备打开文件!
文件打开成功!
准备读取文件!
菜鸟教程官网地址:www.runoob.com
文件关闭成功

fs.ftruncate() - 截取文件

语法

以下为异步模式下截取文件的语法格式:

fs.ftruncate(fd, len, callback)

该方法使用了文件描述符来读取文件。

参数

参数使用说明如下:

  • fd - 通过 fs.open() 方法返回的文件描述符。
  • len - 文件内容截取的长度。
  • callback - 回调函数,没有参数。

实例

input.txt 文件内容为:

site:www.runoob.com

接下来我们创建 file.js 文件,代码如下所示:

var fs = require("fs");
var buf = new Buffer.alloc(1024);

console.log("准备打开文件!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
   console.log("文件打开成功!");
   console.log("截取10字节内的文件内容,超出部分将被去除。");
   
   // 截取文件
   fs.ftruncate(fd, 10, function(err){
      if (err){
         console.log(err);
      } 
      console.log("文件截取成功。");
      console.log("读取相同的文件"); 
      fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
         if (err){
            console.log(err);
         }

         // 仅输出读取的字节
         if(bytes > 0){
            console.log(buf.slice(0, bytes).toString());
         }

         // 关闭文件
         fs.close(fd, function(err){
            if (err){
               console.log(err);
            } 
            console.log("文件关闭成功!");
         });
      });
   });
});

以上代码执行结果如下:

$ node file.js 
准备打开文件!
文件打开成功!
截取10字节内的文件内容,超出部分将被去除。
文件截取成功。
读取相同的文件
site:www.r
文件关闭成功

fs.unlink() - 删除文件

语法

以下为删除文件的语法格式:

fs.unlink(path, callback)

参数

参数使用说明如下:

  • path - 文件路径。
  • callback - 回调函数,没有参数。

实例

input.txt 文件内容为:

site:www.runoob.com

接下来我们创建 file.js 文件,代码如下所示:

var fs = require("fs");

console.log("准备删除文件!");
fs.unlink('input.txt', function(err) {
   if (err) {
       return console.error(err);
   }
   console.log("文件删除成功!");
});

以上代码执行结果如下:

$ node file.js 
准备删除文件!
文件删除成功!

再去查看 input.txt 文件,发现已经不存在了。

fs.mkdir() - 创建目录

语法

以下为创建目录的语法格式:

fs.mkdir(path[, options], callback)

参数

参数使用说明如下:

  • path - 文件路径。
  • options 参数可以是:
    • recursive - 是否以递归的方式创建目录,默认为 false。
    • mode - 设置目录权限,默认为 0777。
  • callback - 回调函数,没有参数。

实例

接下来我们创建 file.js 文件,代码如下所示:

var fs = require("fs");
// tmp 目录必须存在
console.log("创建目录 /tmp/test/");
fs.mkdir("/tmp/test/",function(err){
   if (err) {
       return console.error(err);
   }
   console.log("目录创建成功。");
});

以上代码执行结果如下:

$ node file.js 
创建目录 /tmp/test/
目录创建成功。

可以添加 recursive: true 参数,不管创建的目录 /tmp 和 /tmp/a 是否存在:

fs.mkdir('/tmp/a/apple', { recursive: true }, (err) => {
  if (err) throw err;
});

fs.readdir() - 读取目录

语法

以下为读取目录的语法格式:

fs.readdir(path, callback)

参数

参数使用说明如下:

  • path - 文件路径。
  • callback - 回调函数,回调函数带有两个参数err, files,err 为错误信息,files 为 目录下的文件数组列表

实例

接下来我们创建 file.js 文件,代码如下所示:

var fs = require("fs");

console.log("查看 /tmp 目录");
fs.readdir("/tmp/",function(err, files){
   if (err) {
       return console.error(err);
   }
   files.forEach( function (file){
       console.log( file );
   });
});

以上代码执行结果如下:

$ node file.js 
查看 /tmp 目录
input.out
output.out
test
test.txt

fs.rmdir() - 删除目录

语法

以下为删除目录的语法格式:

fs.rmdir(path, callback)

参数

参数使用说明如下:

  • path - 文件路径。
  • callback - 回调函数,没有参数。

实例

接下来我们创建 file.js 文件,代码如下所示:

var fs = require("fs");
// 执行前创建一个空的 /tmp/test 目录
console.log("准备删除目录 /tmp/test");
fs.rmdir("/tmp/test",function(err){
   if (err) {
       return console.error(err);
   }
   console.log("读取 /tmp 目录");
   fs.readdir("/tmp/",function(err, files){
      if (err) {
          return console.error(err);
      }
      files.forEach( function (file){
          console.log( file );
      });
   });
});

以上代码执行结果如下:

$ node file.js 
准备删除目录 /tmp/test
读取 /tmp 目录
……

API

以下为 Node.js 文件模块相同的方法列表:

序号 方法 描述 同步版
1 fs.rename(oldPath, newPath, callback) 异步 rename().回调函数没有参数,但可能抛出异常。
2 fs.ftruncate(fd, len, callback) 异步 ftruncate().回调函数没有参数,但可能抛出异常。 fs.ftruncateSync(fd, len)
4 fs.truncate(path, len, callback) 异步 truncate().回调函数没有参数,但可能抛出异常。 fs.truncateSync(path, len)
6 fs.chown(path, uid, gid, callback) 异步 chown().回调函数没有参数,但可能抛出异常。 fs.chownSync(path, uid, gid)
8 fs.fchown(fd, uid, gid, callback) 异步 fchown().回调函数没有参数,但可能抛出异常。 fs.fchownSync(fd, uid, gid)
10 fs.lchown(path, uid, gid, callback) 异步 lchown().回调函数没有参数,但可能抛出异常。 fs.lchownSync(path, uid, gid)
12 fs.chmod(path, mode, callback) 异步 chmod().回调函数没有参数,但可能抛出异常。 fs.chmodSync(path, mode)
14 fs.fchmod(fd, mode, callback) 异步 fchmod().回调函数没有参数,但可能抛出异常。 fs.fchmodSync(fd, mode)
16 fs.lchmod(path, mode, callback) 异步 lchmod().回调函数没有参数,但可能抛出异常。Only available on Mac OS X. fs.lchmodSync(path, mode)
18 fs.stat(path, callback) 异步 stat(). 回调函数有两个参数 err, stats,stats 是 fs.Stats 对象。 fs.statSync(path)
19 fs.lstat(path, callback) 异步 lstat(). 回调函数有两个参数 err, stats,stats 是 fs.Stats 对象。 fs.lstatSync(path)
20 fs.fstat(fd, callback) 异步 fstat(). 回调函数有两个参数 err, stats,stats 是 fs.Stats 对象。 fs.fstatSync(fd)
24 fs.link(srcpath, dstpath, callback) 异步 link().回调函数没有参数,但可能抛出异常。 fs.linkSync(srcpath, dstpath)
26 fs.symlink(srcpath, dstpath[, type], callback) 异步 symlink().回调函数没有参数,但可能抛出异常。 type 参数可以设置为 'dir', 'file', 或 'junction' (默认为 'file') 。 fs.symlinkSync(srcpath, dstpath[, type])
28 fs.readlink(path, callback) 异步 readlink(). 回调函数有两个参数 err, linkString。
29 fs.realpath(path[, cache], callback) 异步 realpath(). 回调函数有两个参数 err, resolvedPath。 fs.realpathSync(path[, cache])
31 fs.unlink(path, callback) 异步 unlink().回调函数没有参数,但可能抛出异常。 fs.unlinkSync(path)
33 fs.rmdir(path, callback) 异步 rmdir().回调函数没有参数,但可能抛出异常。 fs.rmdirSync(path)
35 fs.mkdir(path[, mode], callback) S异步 mkdir(2).回调函数没有参数,但可能抛出异常。 访问权限默认为 0777。 fs.mkdirSync(path[, mode])
37 fs.readdir(path, callback) 异步 readdir(3). 读取目录的内容。 fs.readdirSync(path)
39 fs.close(fd, callback) 异步 close().回调函数没有参数,但可能抛出异常。 fs.closeSync(fd)
41 fs.open(path, flags[, mode], callback) 异步打开文件。 fs.openSync(path, flags[, mode])
44 fs.utimesSync(path, atime, mtime) 修改文件时间戳,文件通过指定的文件路径。
46 fs.futimesSync(fd, atime, mtime) 修改文件时间戳,通过文件描述符指定。
47 fs.fsync(fd, callback) 异步 fsync.回调函数没有参数,但可能抛出异常。 fs.fsyncSync(fd)
49 fs.write(fd, buffer, offset, length[, position], callback) 将缓冲区内容写入到通过文件描述符指定的文件。 fs.writeSync(fd, buffer, offset, length[, position])
50 fs.write(fd, data[, position[, encoding]], callback) 通过文件描述符 fd 写入文件内容。 fs.writeSync(fd, data[, position[, encoding]])
53 fs.read(fd, buffer, offset, length, position, callback) 通过文件描述符 fd 读取文件内容。 fs.readSync(fd, buffer, offset, length, position)
55 fs.readFile(filename[, options], callback) 异步读取文件内容。
57 fs.writeFile(filename, data[, options], callback) 异步写入文件内容。 fs.writeFileSync(filename, data[, options])
59 fs.appendFile(filename, data[, options], callback) 异步追加文件内容。 fs.appendFileSync(filename, data[, options])
61 fs.watchFile(filename[, options], listener) 查看文件的修改。
62 fs.unwatchFile(filename[, listener]) 停止查看 filename 的修改。
63 fs.watch(filename[, options][, listener]) 查看 filename 的修改,filename 可以是文件或目录。返回 fs.FSWatcher 对象。
64 fs.exists(path, callback) 检测给定的路径是否存在。 fs.existsSync(path)
66 fs.access(path[, mode], callback) 测试指定路径用户权限。 fs.accessSync(path[, mode])
68 fs.createReadStream(path[, options]) 返回ReadStream 对象。
69 fs.createWriteStream(path[, options]) 返回 WriteStream 对象。
70 fs.symlink(srcpath, dstpath[, type], callback) 异步 symlink().回调函数没有参数,但可能抛出异常。

路径动态拼接的问题

在使用 fs 模块操作文件时,如果提供的操作路径是以 ./ 或 ../ 开头的相对路径时,很容易出现路径动态拼接错误的问题。

原因:代码在运行的时候,会以执行 node 命令时所处的目录 动态拼接出被操作文件的完整路径。

解决方案:在使用 fs 模块操作文件时,直接提供完整的路径(绝对路径),不要提供 ./ 或 ../ 开头的相对路径,从而防止路径动态拼接的问题。

15-Node - 核心模块_回调函数

Path - 路径模块

path 模块提供了一些用于处理文件路径的小工具

path.join() - 连接路径

使用特定于平台的分隔符作为定界符将所有给定的 path 片段连接在一起,然后规范化生成的路径

语法

path.join([...paths])

参数

  • paths - 路径片段的序列。

返回 - 连接后的路径字符串

注意

  • 1、零长度的 path 片段被忽略。 如果连接的路径字符串是零长度字符串,则将返回 '.',表示当前工作目录。
  • 2、如果任何路径片段不是字符串,则抛出 TypeError

实例

path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
// 返回: '/foo/bar/baz/asdf'

path.join('foo', {}, 'bar');
// 抛出 'TypeError: Path must be a string. Received {}'

path.dirname() - 返回目录名

语法

path.dirname(path)

参数

  • path - 路径字符串

如果 path 不是字符串,则抛出 TypeError

返回 - 返回 path 的目录名

实例

path.dirname('/foo/bar/baz/asdf/quux');
// 返回: '/foo/bar/baz/asdf'

path.basename() - 返回文件名

语法

path.basename(path[, ext])

参数

  • path - 路径字符串。
  • ext - 可选的文件扩展名

如果 path 不是字符串,或者如果给定 ext 并且不是字符串,则抛出 TypeError

返回 - 返回 path 的最后一部分,尾随的目录分隔符被忽略

实例

path.basename('/foo/bar/baz/asdf/quux.html');
// 返回: 'quux.html'

path.basename('/foo/bar/baz/asdf/quux.html', '.html');
// 返回: 'quux'

path.extname() - 返回扩展名

语法

path.extname(path)

参数

  • path - <string> ,路径字符串。

如果 path 不是字符串,则抛出 TypeError

返回 - <string>

  • 返回 path 的扩展名。即 path 的最后一部分中从最后一次出现的 .(句点)字符到字符串的结尾。
  • 如果 path 的最后一部分中没有 .,或者除了 path 的基本名称(参见 path.basename())的第一个字符之外没有 . 个字符,则返回空字符串。

实例

path.extname('index.html');
// 返回: '.html'

path.extname('index.coffee.md');
// 返回: '.md'

path.extname('index.');
// 返回: '.'

path.extname('index');
// 返回: ''

path.extname('.index');
// 返回: ''

path.extname('.index.md');
// 返回: '.md'

path.parse() - 解析字符串路径为路径对象

语法

path.parse(path)

参数

  • path - 路径字符串。如果 path 不是字符串,则抛出 TypeError

返回 - <object>

  • 返回一个对象,其属性表示 path 的重要元素。 尾随的目录分隔符被忽略
  • 返回的对象将具有以下属性:{ dir, root, base, name, ext }

实例

path.parse('C:\\path\\dir\\file.txt');

// 返回:
// { root: 'C:\\',
//   dir: 'C:\\path\\dir',
//   base: 'file.txt',
//   ext: '.txt',
//   name: 'file' }

path.format() - 解析路径对象为为字符串路径

语法

path.format(pathObject)

参数

  • pathObject - 具有{dir, root, base, name, ext}属性的 JavaScript 对象,标红的参数优先级高于其他

返回 - <string>

  • 从对象返回路径字符串

注意

  • 1、当向 pathObject 提供属性时,存在一个属性优先于另一个属性的组合
    • 如果提供 pathObject.dir,则忽略 pathObject.root
    • 如果 pathObject.base 存在,则忽略 pathObject.extpathObject.name

实例

// 提供了`dir`,`root` 将被忽略
path.format({
  root: '/ignored',
  dir: '/home/user/dir',
  base: 'file.txt'
});
// 返回: '/home/user/dir/file.txt'

// 提供了`base`,`ext` 将被忽略
path.format({
  root: '/',
  base: 'file.txt',
  ext: 'ignored'
});
// 返回: '/file.txt'

// Windows系统
path.format({
  dir: 'C:\\path\\dir',
  base: 'file.txt'
});
// 返回: 'C:\\path\\dir\\file.txt'

path.normalize() - 规范化路径

规范化给定的 path,解析 '..''.' 片段。

语法

path.normalize(path)

参数

  • path - 待规范的路径

返回 - string

实例

path.normalize('C:\\temp\\\\foo\\bar\\..\\');
// 返回: 'C:\\temp\\foo\\'

path.resolve() - 解析路径片段为绝对路径

语法

path.resolve([...paths])

参数

  • ...paths - <string> ,路径或路径片段的序列

返回 - <string>

  • 将路径或路径片段的序列解析为绝对路径

注意

  • 1、给定的路径序列从右到左处理,每个后续的 path 会被追加到前面,直到构建绝对路径
  • 2、如果在处理完所有给定的 path 片段之后,还没有生成绝对路径,则使用当前工作目录
  • 3、生成的路径被规范化,并删除尾部斜杠(除非路径解析为根目录)
  • 4、零长度的 path 片段被忽略
  • 5、如果没有传入 path 片段,则 path.resolve() 将返回当前工作目录的绝对路径

实例

path.resolve('/foo/bar', './baz');
// 返回: '/foo/bar/baz'

// 给定的路径序列从右到左处理,直到构建绝对路径
path.resolve('/foo/bar', '/tmp/file/');
// 返回: '/tmp/file'

// 如果在处理完所有给定的 path 片段之后,还没有生成绝对路径,则使用当前工作目录
path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif');
// 如果当前工作目录是 /home/myself/node,
// 则返回 '/home/myself/node/wwwroot/static_files/gif/image.gif'

path.relative() - 返回从from到to的相对路径

语法

path.relative(from, to)

参数

  • from - <string> ,起始路径
  • to - <string> ,目标路径

返回

  • 根据当前工作目录返回从 fromto 的相对路径

注意

  • 如果 fromto 都解析为相同的路径(在分别调用 path.resolve() 之后),则返回零长度字符串
  • 如果零长度字符串作为 fromto 传入,则将使用当前工作目录而不是零长度字符串
  • 如果 fromto 不是字符串,则抛出 TypeError

实例

path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb');
// 返回: '../../impl/bbb'

path.isAbsolute() - 路径是否为绝对路径

语法

path.relative(path)

参数

  • path - <string>,路径字符串

返回 - <boolean>

注意

  • 1、如果 path 不是字符串,则抛出 TypeError
  • 2、如果给定的 path 是零长度字符串,则将返回 false

实例

path.isAbsolute('//server');    // true
path.isAbsolute('\\\\server');  // true
path.isAbsolute('C:/foo/..');   // true
path.isAbsolute('C:\\foo\\..'); // true

path.isAbsolute('bar\\baz');    // false
path.isAbsolute('bar/baz');     // false
path.isAbsolute('.');           // false

HTTP - HTTP模块

http.createServer - 创建服务器

http.Server类

'request'事件 - 监听客户端的request请求

server.socket.remoteAddress - 获取远程客户端的IP地址

server.socket.remotePort - 获取远程客户端的端口号

server.listen() - 监听客户端的访问地址和端口

http.Incomingmessage类(request)

message.url - 获取URL中端口之后的路径

http.ServerResponse类

response.end() - 向客户端响应内容,只能写一次

response.write() - 向客户端响应内容,可以写多次

response.setHeader() - 设置响应内容的类型和字符编码

response.writeHead() -

语法

参数

返回

注意

实例