Node.js 入门指南与实践
发布时间: 2024-05-02 12:22:27 阅读量: 6 订阅数: 14
![Node.js 入门指南与实践](https://img-blog.csdnimg.cn/img_convert/4b98795426e05b5274528be953bb6324.webp?x-oss-process=image/format,png)
# 1. Node.js 简介**
Node.js 是一种基于 JavaScript 的运行时环境,用于构建高性能、可扩展的网络应用程序。它采用非阻塞 I/O 模型,使应用程序能够处理大量并发连接,而不会阻塞。Node.js 的核心特性包括事件循环、模块系统和异步编程。
# 2. Node.js 编程基础
### 2.1 Node.js 的核心概念
#### 2.1.1 事件循环和非阻塞 I/O
Node.js 采用事件循环和非阻塞 I/O 模型,这使其能够高效地处理并发请求。事件循环是一个不断运行的循环,它监听事件并根据需要调用回调函数。当发生 I/O 操作时,例如读取文件或发送 HTTP 请求,Node.js 不会阻塞线程等待操作完成。相反,它将操作注册到事件循环,并在操作完成时调用回调函数。
#### 2.1.2 模块系统
Node.js 具有一个模块系统,允许开发者将代码组织成模块,并根据需要加载和使用它们。模块可以包含函数、对象和变量,并且可以使用 `require()` 函数加载。模块系统使得代码组织和重用变得更加容易。
### 2.2 JavaScript 语言特性
#### 2.2.1 函数式编程
Node.js 使用 JavaScript 作为其编程语言,JavaScript 是一种函数式编程语言,这意味着它支持高阶函数和闭包。高阶函数可以接受函数作为参数,或返回函数作为结果。闭包允许函数访问其创建时的外部变量,这使得创建灵活且可重用的代码变得更加容易。
#### 2.2.2 异步编程
Node.js 强调异步编程,这意味着代码可以在不阻塞线程的情况下执行。异步函数使用回调函数或 Promise 来处理异步操作的结果。回调函数是一个在异步操作完成后调用的函数,而 Promise 是一个表示异步操作最终结果或错误的对象。异步编程允许 Node.js 处理大量并发请求,而不会阻塞线程。
**代码块:**
```javascript
// 使用回调函数处理异步文件读取
fs.readFile('file.txt', (err, data) => {
if (err) {
// 处理错误
} else {
// 处理数据
}
});
// 使用 Promise 处理异步文件读取
fs.readFile('file.txt').then((data) => {
// 处理数据
}).catch((err) => {
// 处理错误
});
```
**逻辑分析:**
第一个代码块使用回调函数处理异步文件读取。当文件读取完成后,回调函数将被调用,并传入错误对象和读取的数据。第二个代码块使用 Promise 处理异步文件读取。当文件读取完成后,Promise 将被解析,并传入读取的数据。如果发生错误,Promise 将被拒绝,并传入错误对象。
# 3. Node.js 实践
### 3.1 HTTP 服务器和客户端
#### 3.1.1 创建和使用 HTTP 服务器
**代码块:**
```javascript
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World!');
});
server.listen(3000, () => {
console.log('Server listening on port 3000');
});
```
**逻辑分析:**
* `http` 模块提供用于创建 HTTP 服务器和客户端的 API。
* `http.createServer()` 函数创建一个新的 HTTP 服务器。
* 服务器监听传入的请求,并使用提供的回调函数处理每个请求。
* 回调函数接收两个参数:`req`(请求对象)和 `res`(响应对象)。
* `res.writeHead()` 设置响应状态码和标头。
* `res.end()` 发送响应正文并结束响应。
* `server.listen()` 方法启动服务器并使其在指定的端口上侦听传入的请求。
#### 3.1.2 发送和接收 HTTP 请求
**代码块:**
```javascript
const http = require('http');
const client = http.request({
hostname: 'example.com',
port: 80,
path: '/',
method: 'GET'
}, (res) => {
res.on('data', (chunk) => {
console.log(`BODY: ${chunk}`);
});
res.on('end', () => {
console.log('No more data in response.');
});
});
client.end();
```
**逻辑分析:**
* `http.request()` 函数创建一个新的 HTTP 请求。
* 请求对象指定主机名、端口、路径和方法。
* 回调函数处理响应。
* `res.on('data')` 事件监听器在接收到响应数据块时触发。
* `res.on('end')` 事件监听器在响应结束时触发。
* `client.end()` 方法发送请求。
### 3.2 文件系统操作
#### 3.2.1 文件读写
**代码块:**
```javascript
const fs = require('fs');
fs.readFile('file.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
fs.writeFile('file.txt', 'Hello World!', (err) => {
if (err) throw err;
console.log('File written successfully.');
});
```
**逻辑分析:**
* `fs` 模块提供用于文件系统操作的 API。
* `fs.readFile()` 函数异步读取文件的内容。
* `fs.writeFile()` 函数异步写入文件的内容。
* 回调函数处理错误和结果。
#### 3.2.2 目录操作
**代码块:**
```javascript
const fs = require('fs');
fs.mkdir('new-directory', (err) => {
if (err) throw err;
console.log('Directory created successfully.');
});
fs.readdir('new-directory', (err, files) => {
if (err) throw err;
console.log(files);
});
fs.rmdir('new-directory
```
0
0