Nodejs从入门到高阶-大虫小呓三部曲(进阶篇)

欢迎来到 Node.js 进阶教程!在本教程中,你将学习到更多 Node.js 的高级特性,包括异步编程、事件循环、流处理、数据库连接等。

本教程共三篇分别是:入门篇、进阶篇、高阶篇。适用于有一定web前端基础,想通过学习nodejs发展为全栈工程师的人群。

目录

  1. [异步编程与 Promise](#异步编程与 Promise "#%E5%BC%82%E6%AD%A5%E7%BC%96%E7%A8%8B%E4%B8%8E-promise")
  2. [async/await 语法](#async/await 语法 "#asyncawait-%E8%AF%AD%E6%B3%95")
  3. 事件循环
  4. 流处理
  5. 连接数据库
  6. [构建 RESTful API](#构建 RESTful API "#%E6%9E%84%E5%BB%BA-restful-api")
  7. 总结

异步编程与 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 的性能优化和微服务架构。

相关推荐
JVM高并发17 小时前
使用 Cloudflare Tunnel(本地管理隧道)搭配 DigitalPlat 免费域名实现内网穿透
网络协议·全栈
liangshanbo121518 小时前
Webpack 文件指纹面试题整理
前端·webpack·node.js
liangshanbo121519 小时前
Webpack 常见 Plugin 面试题
前端·webpack·node.js
liangshanbo121520 小时前
Webpack Tree Shaking 面试题整理
前端·webpack·node.js
搬砖的小码农_Sky20 小时前
AI Agent:Node.js和浏览器运行环境的本质区别
javascript·node.js·人机交互
李游Leo21 小时前
HarmonyOS 7 ArkTS + Node.js:把权限声明、运行时授权与隐私文案做成提审前一致性扫描【鸿蒙心迹】
华为·node.js·harmonyos
liangshanbo12151 天前
Webpack的分包策略面试题
前端·webpack·node.js
搬砖的小码农_Sky1 天前
AI Agent:Windows上Node.js安装后 npm -v报错
前端·npm·node.js·人机交互
不是株2 天前
零到全栈(第一次上线:把全栈应用搬上服务器)
全栈
liangshanbo12152 天前
面试题:如何优化 Webpack 的打包速度?
前端·webpack·node.js