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


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

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

目录

  1. 异步编程与 Promise
  2. async/await 语法
  3. 事件循环
  4. 流处理
  5. 连接数据库(包含 Mysql、MongoDB以及 Redis)
  6. 构建 RESTful API
  7. 总结

异步编程与 Promise

Node.js 是单线程的,但它通过异步编程模型实现了高并发。Promise 是处理异步操作的一种方式。

创建 async_example.js

// 模拟异步操作
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);
  });

运行示例:

node async_example.js

async/await 语法

async/await 是 ES2017 引入的特性,它让异步代码看起来像同步代码,更容易理解和维护。

创建 async_await_example.js

// 模拟异步操作
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();

运行示例:

node async_await_example.js

事件循环

Node.js 的事件循环是其高性能的核心。理解事件循环有助于编写更高效的代码。

创建 event_loop_example.js

console.log('1. 开始执行');

setTimeout(() => {
  console.log('2. setTimeout 回调');
}, 0);

setImmediate(() => {
  console.log('3. setImmediate 回调');
});

process.nextTick(() => {
  console.log('4. process.nextTick 回调');
});

console.log('5. 执行结束');

运行示例:

node event_loop_example.js

观察输出顺序,理解事件循环的不同阶段。

流处理

Node.js 的流(Stream)是一种处理数据流的强大工具,特别适用于大文件处理。

创建 stream_example.js

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 文件:

echo "Hello, 大虫小呓! This is a test file for streams." > example.txt

然后运行流处理示例:

node stream_example.js

查看生成的 uppercase_example.txt 文件内容。

连接数据库

在实际项目中,我们经常需要连接数据库。这里以 MongoDB、MySQL 和 Redis 为例,展示如何在 Node.js 中连接不同的数据库。

MongoDB 示例

首先安装 MongoDB 驱动:

npm install mongodb

创建 db_example.js

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 服务器。

MySQL 示例

首先安装 MySQL 驱动:

npm install mysql2

创建 mysql_example.js

const mysql = require('mysql2/promise');

async function connectToMySQL() {
  // 创建连接配置
  const config = {
    host: 'localhost',
    user: 'root',
    password: 'your_password', // 请替换为你的 MySQL 密码
    database: 'testdb'
  };

  let connection;
  
  try {
    // 建立连接
    connection = await mysql.createConnection(config);
    console.log('成功连接到 MySQL');

    // 创建表(如果不存在)
    await connection.execute(`
      CREATE TABLE IF NOT EXISTS users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(255) NOT NULL,
        email VARCHAR(255) NOT NULL
      )
    `);
    
    // 插入数据
    const [insertResult] = await connection.execute(
      'INSERT INTO users (name, email) VALUES (?, ?)',
      ['大虫小呓', 'dachongxiaoyi@example.com']
    );
    console.log('插入的记录 ID:', insertResult.insertId);

    // 查询数据
    const [rows] = await connection.execute('SELECT * FROM users WHERE name = ?', ['大虫小呓']);
    console.log('找到的用户:', rows[0]);
  } catch (error) {
    console.error('MySQL 连接错误:', error);
  } finally {
    // 关闭连接
    if (connection) {
      await connection.end();
      console.log('断开 MySQL 数据库连接');
    }
  }
}

connectToMySQL();

注意:要运行这个示例,你需要先安装并启动 MySQL 服务器,并将代码中的 your_password 替换为你的实际密码。

Redis 示例

首先安装 Redis 驱动:

npm install redis

创建 redis_example.js

const redis = require('redis');

async function connectToRedis() {
  // 创建 Redis 客户端
  const client = redis.createClient({
    host: 'localhost',
    port: 6379
  });

  try {
    // 连接到 Redis
    await client.connect();
    console.log('成功连接到 Redis');

    // 设置键值对
    await client.set('user:name', '大虫小呓');
    await client.set('user:email', 'dachongxiaoyi@example.com');
    
    // 获取值
    const name = await client.get('user:name');
    const email = await client.get('user:email');
    console.log('用户名:', name);
    console.log('邮箱:', email);
    
    // 使用哈希存储用户信息
    await client.hSet('user:1', {
      name: '大虫小呓',
      email: 'dachongxiaoyi@example.com'
    });
    
    // 获取哈希值
    const user = await client.hGetAll('user:1');
    console.log('用户信息:', user);
  } catch (error) {
    console.error('Redis 连接错误:', error);
  } finally {
    // 关闭连接
    await client.quit();
    console.log('断开 Redis 连接');
  }
}

connectToRedis();

注意:要运行这个示例,你需要先安装并启动 Redis 服务器。

构建 RESTful API

使用 Express.js 框架可以快速构建 RESTful API。

首先安装 Express:

npm install express

创建 api_example.js

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 服务器:

node api_example.js

你可以使用 curl 或 Postman 测试这些 API 端点:

# 获取所有用户
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 的异步编程、事件循环、流处理、数据库连接(包含Mysql、MongoDB以 及 Redis)和 RESTful API 构建等高级特性。这些知识将帮助你构建更复杂和强大的 Node.js 应用。接下来可以学习高阶教程,深入了解 Node.js 的性能优化和微服务架构。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值