
欢迎来到 Node.js 进阶教程!在本教程中,你将学习到更多 Node.js 的高级特性,包括异步编程、事件循环、流处理、数据库连接等。
本教程共三篇分别是:入门篇、进阶篇、高阶篇。适用于有一定web前端基础,想通过学习nodejs发展为全栈工程师的人群。
目录
- [异步编程与 Promise](#异步编程与 Promise "#%E5%BC%82%E6%AD%A5%E7%BC%96%E7%A8%8B%E4%B8%8E-promise")
- [async/await 语法](#async/await 语法 "#asyncawait-%E8%AF%AD%E6%B3%95")
- 事件循环
- 流处理
- 连接数据库
- [构建 RESTful API](#构建 RESTful API "#%E6%9E%84%E5%BB%BA-restful-api")
- 总结
异步编程与 Promise
Node.js 是单线程的,但它通过异步编程模型实现了高并发。Promise 是处理异步操作的一种方式。
创建 async_example.js
:
javascript
// 模拟异步操作
function fetchData(name) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (name === '大虫小呓') {
resolve({ name, data: '这是来自服务器的数据' });
} else {
reject(new Error('用户不存在'));
}
}, 1000);
});
}
// 使用 Promise
fetchData('大虫小呓')
.then(result => {
console.log(result);
})
.catch(error => {
console.error(error.message);
});
运行示例:
bash
node async_example.js
async/await 语法
async/await
是 ES2017 引入的特性,它让异步代码看起来像同步代码,更容易理解和维护。
创建 async_await_example.js
:
javascript
// 模拟异步操作
function fetchData(name) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (name === '大虫小呓') {
resolve({ name, data: '这是来自服务器的数据' });
} else {
reject(new Error('用户不存在'));
}
}, 1000);
});
}
// 使用 async/await
async function getData() {
try {
const result = await fetchData('大虫小呓');
console.log(result);
} catch (error) {
console.error(error.message);
}
}
getData();
运行示例:
bash
node async_await_example.js
事件循环
Node.js 的事件循环是其高性能的核心。理解事件循环有助于编写更高效的代码。
创建 event_loop_example.js
:
javascript
console.log('1. 开始执行');
setTimeout(() => {
console.log('2. setTimeout 回调');
}, 0);
setImmediate(() => {
console.log('3. setImmediate 回调');
});
process.nextTick(() => {
console.log('4. process.nextTick 回调');
});
console.log('5. 执行结束');
运行示例:
bash
node event_loop_example.js
观察输出顺序,理解事件循环的不同阶段。
流处理
Node.js 的流(Stream)是一种处理数据流的强大工具,特别适用于大文件处理。
创建 stream_example.js
:
javascript
const fs = require('fs');
const { Transform } = require('stream');
// 创建一个转换流,将文本转换为大写
class UpperCaseTransform extends Transform {
_transform(chunk, encoding, callback) {
this.push(chunk.toString().toUpperCase());
callback();
}
}
// 创建读取流和写入流
const readStream = fs.createReadStream('example.txt');
const writeStream = fs.createWriteStream('uppercase_example.txt');
const upperCaseTransform = new UpperCaseTransform();
// 管道连接流
readStream
.pipe(upperCaseTransform)
.pipe(writeStream)
.on('finish', () => {
console.log('文件转换完成!');
});
首先创建一个 example.txt
文件:
bash
echo "Hello, 大虫小呓! This is a test file for streams." > example.txt
然后运行流处理示例:
bash
node stream_example.js
查看生成的 uppercase_example.txt
文件内容。
连接数据库
在实际项目中,我们经常需要连接数据库。这里以 MongoDB 为例,展示如何在 Node.js 中连接数据库。
首先安装 MongoDB 驱动:
bash
npm install mongodb
创建 db_example.js
:
javascript
const { MongoClient } = require('mongodb');
async function connectToDatabase() {
const uri = 'mongodb://localhost:27017';
const client = new MongoClient(uri);
try {
// 连接到 MongoDB
await client.connect();
console.log('成功连接到 MongoDB');
// 选择数据库和集合
const database = client.db('testdb');
const collection = database.collection('users');
// 插入文档
const user = { name: '大虫小呓', email: 'dachongxiaoyi@example.com' };
const result = await collection.insertOne(user);
console.log('插入的文档 ID:', result.insertedId);
// 查询文档
const query = { name: '大虫小呓' };
const userFound = await collection.findOne(query);
console.log('找到的用户:', userFound);
} finally {
// 确保关闭连接
await client.close();
console.log('断开数据库连接');
}
}
connectToDatabase().catch(console.error);
注意:要运行这个示例,你需要先安装并启动 MongoDB 服务器。
构建 RESTful API
使用 Express.js 框架可以快速构建 RESTful API。
首先安装 Express:
bash
npm install express
创建 api_example.js
:
javascript
const express = require('express');
const app = express();
const port = 3000;
// 中间件,用于解析 JSON 请求体
app.use(express.json());
// 模拟数据存储
let users = [
{ id: 1, name: '大虫小呓', email: 'dachongxiaoyi@example.com' },
{ id: 2, name: '张三', email: 'zhangsan@example.com' }
];
// 获取所有用户
app.get('/users', (req, res) => {
res.json(users);
});
// 根据 ID 获取用户
app.get('/users/:id', (req, res) => {
const userId = parseInt(req.params.id);
const user = users.find(u => u.id === userId);
if (!user) {
return res.status(404).json({ message: '用户未找到' });
}
res.json(user);
});
// 创建新用户
app.post('/users', (req, res) => {
const newUser = {
id: users.length + 1,
name: req.body.name,
email: req.body.email
};
users.push(newUser);
res.status(201).json(newUser);
});
// 启动服务器
app.listen(port, () => {
console.log(`服务器运行在 http://localhost:${port}`);
});
运行 API 服务器:
bash
node api_example.js
你可以使用 curl 或 Postman 测试这些 API 端点:
bash
# 获取所有用户
curl http://localhost:3000/users
# 获取特定用户
curl http://localhost:3000/users/1
# 创建新用户
curl -X POST -H "Content-Type: application/json" -d '{"name":"李四","email":"lisi@example.com"}' http://localhost:3000/users
总结
通过本教程,你学习了 Node.js 的异步编程、事件循环、流处理、数据库连接和 RESTful API 构建等高级特性。这些知识将帮助你构建更复杂和强大的 Node.js 应用。接下来可以学习高阶教程,深入了解 Node.js 的性能优化和微服务架构。