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), stats 是
fs.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 模块操作文件时,直接提供完整的路径(绝对路径),不要提供 ./ 或 ../ 开头的相对路径,从而防止路径动态拼接的问题。
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.ext
和pathObject.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>
,目标路径
返回
- 根据当前工作目录返回从
from
到to
的相对路径
注意
- 如果
from
和to
都解析为相同的路径(在分别调用path.resolve()
之后),则返回零长度字符串 - 如果零长度字符串作为
from
或to
传入,则将使用当前工作目录而不是零长度字符串 - 如果
from
或to
不是字符串,则抛出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() -
语法
参数
返回
注意
实例