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

相关推荐
妮妮喔妮12 小时前
vue3+vite中使用path-to-regexp以及相关的报错问题
node.js
拾光拾趣录14 小时前
老板突然要看“代码当量 KPI”
前端·node.js
skywalk816315 小时前
基于Node.js开发的开源博客平台ghost安装和使用
开源·node.js·自动化·博客
绅士玖16 小时前
🔐 JWT 登录鉴权实战:从前端到Mock的全流程解析 🚀
前端·全栈
月明啸21 小时前
分析总结node中不同文件名后缀如何导入node内置模块
后端·node.js
泉城老铁21 小时前
Vue中实现Word、Excel、PDF预览的详细步骤
前端·vue.js·node.js
缘来小哥1 天前
Nodejs的多版本管理,不仅仅只是nvm的使用
前端·node.js
Littlewith2 天前
Node.js:连接Mysql、JXcore打包
java·服务器·c语言·开发语言·数据库·mysql·node.js
じòぴé南冸じょうげん2 天前
报错error:0308010C:digital envelope routines::unsupported解决方案
前端·javascript·vue.js·npm·node.js