Node.js复习合集

Node.js 的 fs 模块用于与文件系统进行交互。通过 fs 模块,您可以对文件进行读取、写入、删除、重命名等操作。以下是 fs 模块的一些主要功能和示例代码。

1. 引入 fs 模块

在使用 fs 模块之前,需要先将其引入:

const fs = require('fs');

2. 读取文件

fs 模块提供了同步和异步两种方式来读取文件。

异步读取文件

fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(data);
});

在这个例子中,fs.readFile 异步读取文件 example.txt。回调函数中,如果读取成功,data 参数将包含文件内容。

同步读取文件

try {
  const data = fs.readFileSync('example.txt', 'utf8');
  console.log(data);
} catch (err) {
  console.error(err);
}

fs.readFileSync 同步读取文件,读取结果会立即返回,如果发生错误,会抛出异常,需要通过 try...catch 捕获。

3. 写入文件

fs 模块也提供了异步和同步两种方式来写入文件。

异步写入文件

const content = 'This is some content to write to the file.';
fs.writeFile('example.txt', content, err => {
  if (err) {
    console.error(err);
    return;
  }
  console.log('File has been written');
});

fs.writeFile 异步写入文件 example.txt,如果文件不存在会创建新文件。

同步写入文件

const content = 'This is some content to write to the file.';
try {
  fs.writeFileSync('example.txt', content);
  console.log('File has been written');
} catch (err) {
  console.error(err);
}

fs.writeFileSync 同步写入文件,会立即写入并返回,发生错误时抛出异常。

4. 追加内容到文件

有时我们需要在文件末尾追加内容,fs 提供了 appendFileappendFileSync 方法。

异步追加内容

const additionalContent = '\nThis content will be appended to the file.';
fs.appendFile('example.txt', additionalContent, err => {
  if (err) {
    console.error(err);
    return;
  }
  console.log('Content has been appended');
});

同步追加内容

const additionalContent = '\nThis content will be appended to the file.';
try {
  fs.appendFileSync('example.txt', additionalContent);
  console.log('Content has been appended');
} catch (err) {
  console.error(err);
}

5. 删除文件

删除文件可以使用 unlinkunlinkSync 方法。

异步删除文件

fs.unlink('example.txt', err => {
  if (err) {
    console.error(err);
    return;
  }
  console.log('File has been deleted');
});

同步删除文件

try {
  fs.unlinkSync('example.txt');
  console.log('File has been deleted');
} catch (err) {
  console.error(err);
}

6. 创建目录

fs 模块提供了 mkdirmkdirSync 方法来创建目录。

异步创建目录

fs.mkdir('exampleDir', { recursive: true }, err => {
  if (err) {
    console.error(err);
    return;
  }
  console.log('Directory has been created');
});

在这个例子中,{ recursive: true } 选项表示如果父目录不存在会自动创建。

同步创建目录

try {
  fs.mkdirSync('exampleDir', { recursive: true });
  console.log('Directory has been created');
} catch (err) {
  console.error(err);
}

7. 读取目录内容

读取目录内容可以使用 readdirreaddirSync 方法。

异步读取目录内容

fs.readdir('exampleDir', (err, files) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(files);
});

同步读取目录内容

try {
  const files = fs.readdirSync('exampleDir');
  console.log(files);
} catch (err) {
  console.error(err);
}

8. 重命名文件或目录

fs 模块提供了 renamerenameSync 方法来重命名文件或目录。

异步重命名

fs.rename('oldName.txt', 'newName.txt', err => {
  if (err) {
    console.error(err);
    return;
  }
  console.log('File has been renamed');
});

同步重命名

try {
  fs.renameSync('oldName.txt', 'newName.txt');
  console.log('File has been renamed');
} catch (err) {
  console.error(err);
}

总结

Node.js 的 fs 模块提供了丰富的文件系统操作功能,包括文件和目录的读取、写入、追加、删除、重命名等操作。无论是异步操作还是同步操作,都可以满足不同的使用需求。通过学习和实践这些方法,可以高效地进行文件系统操作。

Node.js 的 path 模块提供了一系列实用工具,用于处理和转换文件路径。path 模块是 Node.js 核心模块之一,不需要额外安装。

引入 path 模块

在使用 path 模块之前,需要先将其引入:

const path = require('path');

1. path.basename(path, [ext])

path.basename 方法返回路径的最后一部分,可以选择去掉文件扩展名。

const filePath = '/home/user/dir/file.txt';

// 获取文件名(带扩展名)
const baseNameWithExt = path.basename(filePath);
console.log(baseNameWithExt); // 输出: 'file.txt'

// 获取文件名(不带扩展名)
const baseNameWithoutExt = path.basename(filePath, '.txt');
console.log(baseNameWithoutExt); // 输出: 'file'

2. path.dirname(path)

path.dirname 方法返回路径的目录部分。

const filePath = '/home/user/dir/file.txt';
const dirName = path.dirname(filePath);
console.log(dirName); // 输出: '/home/user/dir'

3. path.extname(path)

path.extname 方法返回路径中文件的扩展名。

const filePath = '/home/user/dir/file.txt';
const extName = path.extname(filePath);
console.log(extName); // 输出: '.txt'

4. path.join([...paths])

path.join 方法将多个路径片段拼接成一个完整的路径。

const joinedPath = path.join('/home', 'user', 'dir', 'file.txt');
console.log(joinedPath); // 输出: '/home/user/dir/file.txt'

它也会规范化路径,去除多余的斜杠。

const joinedPath = path.join('/home//user/', 'dir', 'file.txt');
console.log(joinedPath); // 输出: '/home/user/dir/file.txt'

5. path.resolve([...paths])

path.resolve 方法将路径或路径片段解析为绝对路径。

const absolutePath = path.resolve('dir/file.txt');
console.log(absolutePath); // 输出: '/当前工作目录/dir/file.txt'

如果传入的路径片段中包含绝对路径,则之前的路径片段会被忽略。

const absolutePath = path.resolve('/home/user', 'dir', 'file.txt');
console.log(absolutePath); // 输出: '/home/user/dir/file.txt'

6. path.normalize(path)

path.normalize 方法规范化给定的路径,处理诸如 ... 的片段。

const normalizedPath = path.normalize('/home//user/../dir/file.txt');
console.log(normalizedPath); // 输出: '/home/dir/file.txt'

7. path.isAbsolute(path)

path.isAbsolute 方法判断给定的路径是否为绝对路径。

console.log(path.isAbsolute('/home/user/dir/file.txt')); // 输出: true
console.log(path.isAbsolute('home/user/dir/file.txt'));  // 输出: false

8. path.relative(from, to)

path.relative 方法根据当前目录的路径,返回从一个路径到另一个路径的相对路径。

const fromPath = '/home/user/dir';
const toPath = '/home/user/dir/subdir/file.txt';
const relativePath = path.relative(fromPath, toPath);
console.log(relativePath); // 输出: 'subdir/file.txt'

9. path.parse(path)

path.parse 方法返回一个对象,包含路径的各个部分。

const filePath = '/home/user/dir/file.txt';
const parsedPath = path.parse(filePath);
console.log(parsedPath);
/* 输出:
{
  root: '/',
  dir: '/home/user/dir',
  base: 'file.txt',
  ext: '.txt',
  name: 'file'
}
*/

10. path.format(pathObject)

path.format 方法与 path.parse 相反,接受一个对象格式的路径,返回一个字符串路径。

const pathObject = {
  root: '/',
  dir: '/home/user/dir',
  base: 'file.txt',
  ext: '.txt',
  name: 'file'
};
const formattedPath = path.format(pathObject);
console.log(formattedPath); // 输出: '/home/user/dir/file.txt'

11. path.sep

path.sep 属性提供平台特定的路径片段分隔符:

  • POSIX (Linux/macOS): /
  • Windows: \\
console.log(path.sep); // 在 POSIX 系统上输出: '/',在 Windows 上输出: '\\'

12. path.delimiter

path.delimiter 属性提供平台特定的路径分隔符:

  • POSIX (Linux/macOS): :
  • Windows: ;
console.log(path.delimiter); // 在 POSIX 系统上输出: ':',在 Windows 上输出: ';'

综合示例

以下示例综合使用了多个 path 模块的方法,展示如何构建和解析路径。

const path = require('path');

// 构建路径
const dirPath = path.join(__dirname, 'src', 'modules');
const filePath = path.join(dirPath, 'app.js');
console.log('Directory Path:', dirPath);
console.log('File Path:', filePath);

// 解析路径
const parsedPath = path.parse(filePath);
console.log('Parsed Path:', parsedPath);

// 判断路径是否为绝对路径
console.log('Is Absolute:', path.isAbsolute(filePath));

// 获取路径的目录名、基础名和扩展名
console.log('Directory Name:', path.dirname(filePath));
console.log('Base Name:', path.basename(filePath));
console.log('Extension Name:', path.extname(filePath));

// 规范化路径
const messyPath = '/home//user/../dir/file.txt';
const normalizedPath = path.normalize(messyPath);
console.log('Normalized Path:', normalizedPath);

// 获取相对路径
const relativePath = path.relative('/home/user/dir', '/home/user/dir/subdir/file.txt');
console.log('Relative Path:', relativePath);

// 构建路径字符串
const pathObject = {
  root: '/',
  dir: '/home/user/dir',
  base: 'file.txt',
  ext: '.txt',
  name: 'file'
};
const formattedPath = path.format(pathObject);
console.log('Formatted Path:', formattedPath);

// 获取路径分隔符
console.log('Path Separator:', path.sep);

// 获取路径分隔符
console.log('Path Delimiter:', path.delimiter);

通过上述示例和解释,您可以全面了解 Node.js path 模块的功能和用法。该模块在处理文件路径时非常有用,可以帮助您编写更健壮和跨平台的代码。

Node.js 的 http 模块是构建 Web 服务器和处理 HTTP 请求与响应的核心模块。它提供了创建 HTTP 服务器和客户端的功能。以下是对 http 模块的详细介绍和代码示例。

1. 引入 http 模块

在使用 http 模块之前,需要先将其引入:

const http = require('http');

2. 创建 HTTP 服务器

创建一个基本的 HTTP 服务器:

const http = require('http');

// 创建服务器
const server = http.createServer((req, res) => {
  // 设置响应头
  res.writeHead(200, {'Content-Type': 'text/plain'});
  // 发送响应内容
  res.end('Hello, World!\n');
});

// 服务器监听端口
server.listen(3000, '127.0.0.1', () => {
  console.log('Server running at http://127.0.0.1:3000/');
});

上述代码创建了一个简单的 HTTP 服务器,监听 127.0.0.1 上的 3000 端口。当访问此服务器时,它会返回 “Hello, World!”。

3. 处理 HTTP 请求

HTTP 服务器可以处理不同的请求方法和 URL:

const http = require('http');

// 创建服务器
const server = http.createServer((req, res) => {
  if (req.method === 'GET' && req.url === '/') {
    // 处理 GET 请求到根路径
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Welcome to the Home Page!\n');
  } else if (req.method === 'GET' && req.url === '/about') {
    // 处理 GET 请求到 /about 路径
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Welcome to the About Page!\n');
  } else {
    // 处理未定义的请求
    res.writeHead(404, {'Content-Type': 'text/plain'});
    res.end('Page Not Found\n');
  }
});

// 服务器监听端口
server.listen(3000, '127.0.0.1', () => {
  console.log('Server running at http://127.0.0.1:3000/');
});

这个服务器根据不同的 URL 处理不同的请求,并返回相应的响应。

4. 处理 POST 请求

处理 POST 请求时,我们需要从请求主体中读取数据:

const http = require('http');

// 创建服务器
const server = http.createServer((req, res) => {
  if (req.method === 'POST' && req.url === '/submit') {
    let body = '';

    // 监听 data 事件获取数据
    req.on('data', chunk => {
      body += chunk.toString();
    });

    // 监听 end 事件处理完成的请求
    req.on('end', () => {
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end(`Received data: ${body}\n`);
    });
  } else {
    res.writeHead(404, {'Content-Type': 'text/plain'});
    res.end('Page Not Found\n');
  }
});

// 服务器监听端口
server.listen(3000, '127.0.0.1', () => {
  console.log('Server running at http://127.0.0.1:3000/');
});

这个服务器会在 /submit 路径上处理 POST 请求,并将接收到的数据返回给客户端。

5. 创建 HTTP 客户端

Node.js 的 http 模块还可以用来发起 HTTP 请求,充当客户端。

const http = require('http');

// 选项参数
const options = {
  hostname: 'www.example.com',
  port: 80,
  path: '/',
  method: 'GET'
};

// 创建请求
const req = http.request(options, res => {
  console.log(`STATUS: ${res.statusCode}`);
  console.log(`HEADERS: ${JSON.stringify(res.headers)}`);

  // 设置编码
  res.setEncoding('utf8');

  // 监听 data 事件获取响应数据
  res.on('data', chunk => {
    console.log(`BODY: ${chunk}`);
  });

  // 监听 end 事件
  res.on('end', () => {
    console.log('No more data in response.');
  });
});

// 监听 error 事件
req.on('error', e => {
  console.error(`Problem with request: ${e.message}`);
});

// 结束请求
req.end();

这个客户端代码发起一个 GET 请求到 www.example.com,并打印响应状态、头信息和主体内容。

6. 使用 http 模块的高级特性

http 模块还提供了许多高级特性,比如使用 http.Agent 管理 HTTP 连接池。

使用 HTTP 代理

const http = require('http');

// 创建代理服务器
const proxy = http.createServer((req, res) => {
  const options = {
    hostname: 'www.example.com',
    port: 80,
    path: req.url,
    method: req.method,
    headers: req.headers
  };

  // 发起代理请求
  const proxyReq = http.request(options, proxyRes => {
    res.writeHead(proxyRes.statusCode, proxyRes.headers);
    proxyRes.pipe(res, {
      end: true
    });
  });

  req.pipe(proxyReq, {
    end: true
  });
});

// 代理服务器监听端口
proxy.listen(3000, '127.0.0.1', () => {
  console.log('Proxy server running at http://127.0.0.1:3000/');
});

这个代理服务器将所有请求转发到 www.example.com,并返回响应。

总结

Node.js 的 http 模块功能强大,可以用来构建各种 Web 服务器和客户端。以下是 http 模块的一些主要功能和示例代码:

  1. 创建 HTTP 服务器
  2. 处理 HTTP 请求方法和 URL
  3. 处理 POST 请求
  4. 创建 HTTP 客户端
  5. 使用高级特性如代理服务器

通过学习和实践这些示例,可以熟练掌握 Node.js http 模块的基本和高级用法。

© 版权声明
THE END
喜欢就支持一下吧
点赞7赞赏 分享
评论 抢沙发

    暂无评论内容