NodeJS 101 — 第2部分 MySQL

发布: (2026年1月8日 GMT+8 12:04)
8 min read
原文: Dev.to

I’m happy to translate the article for you, but I need the actual text you’d like translated. Could you please paste the content (or the portion you want translated) here? I’ll keep the source link exactly as you provided and preserve all formatting, markdown, and code blocks.

📖 前言

本文件是使用 JavaScript (Node.js) 语言开发 web serviceRESTful API,并结合以下框架和库:

  • 🌐 Express – 用于创建 Web 服务器的 HTTP 框架
  • 🗄️ Sequelize – 用于管理数据库的 ORM
  • 💾 MySQL – 关系型数据库
  • 🔧 POSTMAN – API 测试工具

📚 目录

Module 2: 💾 Basic API MySQL

学习如何在 Express 中连接和使用 MySQL 数据库

⬆ 返回目录

Section 2‑1 – 🚀 创建新的 Express 和 MySQL 应用

⬆ 返回目录

📁 创建新项目

  1. 创建文件夹 demo-mysql

    mkdir demo-mysql
  2. 进入文件夹 demo-mysql

    cd demo-mysql

    ⚠️ 注意: 文档中出现的 cd mkdir demo-mysql 命令不正确,创建文件夹后应使用 cd demo-mysql

  3. 创建 Node.js 应用程序

    npm init -y

    此命令会自动生成 package.json 文件

📄 创建 index.js 文件

const express = require('express');
const cors = require('cors');          // ✅ 使用 cors 包代替 require('express')
const PORT = process.env.PORT || 5000;
const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cors());

app.listen(PORT, () => {
    console.log(`CORS enabled server listening on ${PORT}`);
});

⚠️ 注意: 之前的代码对 cors 使用了 require('express'),这是不正确的,应该使用 require('cors')

📦 安装必要的包

主要包

npm install express mysql2 cors --save

开发依赖 – Nodemon

npm install -D nodemon

如果需要全局安装(可选)

npm install -g nodemon

📋 已安装的包

PackageDescription
expressNode.js 的 Web 框架
mysql2Node.js 的 MySQL 客户端
cors用于处理跨域资源共享(CORS)的中间件
nodemon当文件修改时自动重启服务器

Section 2‑2 – 🔌 连接 MySQL 数据库

⬆ 返回目录

📦 导入 MySQL2

index.js 中添加以下行:

const mysql = require('mysql2');

🔌 连接 MySQL 数据库

方法 1 – 使用常量

const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'basic_api_express_db'
});

方法 2 – 使用环境变量(推荐)⭐

const connection = mysql.createConnection({
    host: process.env.DB_HOSTNAME   || 'localhost',
    user: process.env.DB_USERNAME   || 'root',
    password: process.env.DB_PASSWORD || '',
    database: process.env.DB_DATABASE || 'basic_api_express_db'
});

💡 建议: 使用方法 2,以确保安全性和部署的灵活性

📥 测试从数据库获取数据

index.js 中添加以下代码:

// Get all users
app.get('/users', (req, res) => {
    try {
        connection.query('SELECT * FROM `users`', (err, results) => {
            if (err) {
                return res.status(500).json({ message: "Database error", error: err });
            }
            res.status(200).json(results);
        });
    } catch (error) {
        res.status(400).json({ message: "Get users failed", error: error.message });
    }
});

// Get user by id
app.get('/users/:id', (req, res) => {
    try {
        const id = req.params.id;
        connection.query(
            'SELECT * FROM `users` WHERE `id` = ?',
            [id],
            (err, results) => {
                if (err) {
                    return res.status(500).json({ message: "Database error", error: err });
                }
                if (results.length === 0) {
                    return res.status(404).json({ message: "User not found" });
                }
                res.status(200).json({ payload: results });
            }
        );
    } catch (error) {
        res.status(400).json({ message: "Get user by id failed", error: error.message });
    }
});

🧪 测试 API

GET http://localhost:5000/users
GET http://localhost:5000/users/1

Section 2‑3 – ➕ CREATE USER

(内容尚未指定 – 请根据需要添加代码和说明)

Section 2‑4 – ✏️ UPDATE USER

(内容尚未指定 – 请根据需要添加代码和说明)

解释以下内容按需求)*

Section 2‑5 – 🗑️ DELETE USER

(内容尚未指定 – 按需求插入代码和说明)


注意: 如果需要添加创建、编辑和删除用户的部分,请遵循 GET /usersGET /users/:id 的模式,使用 INSERTUPDATEDELETE 通过 connection.query,并进行相同的错误处理。

5000/users/1


Section 2‑3 – ➕ CREATE USER

⬆ 返回目录

➕ 创建新 User

添加到文件: index.js

app.post('/users', (req, res, next) => {
    try {
        const { fname, lname, username, password, avatar } = req.body;

        connection.query(
            'INSERT INTO `users`(`fname`, `lname`, `username`, `password`, `avatar`) VALUES (?, ?, ?, ?, ?)',
            [fname, lname, username, password, avatar],
            (err, results) => {
                if (err) {
                    return res.status(500).json({
                        message: "create user was failed",
                        error: err.message
                    });
                }
                res.status(201).json({
                    message: "create user was successfully",
                    payload: results
                });
            }
        );
    } catch (error) {
        res.status(400).json({
            message: "create user was failed",
            error: error.message
        });
    }
});

🔍 代码说明

  • INSERT INTO – 用于插入数据的 SQL 语句
  • ? – 用于防止 SQL 注入的占位符
  • status(201) – 表示创建成功的 HTTP 状态码

🧪 测试 API

POST http://localhost:5000/users
Content-Type: application/json

{
  "fname": "John",
  "lname": "Doe",
  "username": "johndoe",
  "password": "password123",
  "avatar": "https://example.com/avatar.jpg"
}

Section 2‑4 – ✏️ UPDATE USER

⬆ 返回目录

✏️ 更新 User 信息

添加到文件: index.js

app.put('/users/:id', (req, res, next) => {
    try {
        const id = req.params.id;
        const { fname, lname, username, password, avatar } = req.body;

        connection.query(
            'UPDATE `users` SET `fname`= ?, `lname`= ?, `username`= ?, `password`= ?, `avatar`= ? WHERE id = ?',
            [fname, lname, username, password, avatar, id],
            (err, results) => {
                if (err) {
                    return res.status(500).json({
                        message: "update user was failed",
                        error: err.message
                    });
                }
                if (results.affectedRows === 0) {
                    return res.status(404).json({
                        message: "User not found"
                    });
                }
                res.status(200).json({
                    message: "update user was successfully",
                    payload: results
                });
            }
        );
    } catch (error) {
        res.status(400).json({
            message: "update user was failed",
            error: error.message
        });
    }
});

🔍 代码说明

  • UPDATE – 用于更新数据的 SQL 语句
  • affectedRows – 被更新的行数(0 表示未找到记录)

🧪 测试 API

PUT http://localhost:5000/users/1
Content-Type: application/json

{
  "fname": "Jane",
  "lname": "Doe",
  "username": "janedoe",
  "password": "newpassword123",
  "avatar": "https://example.com/new-avatar.jpg"
}

Section 2‑5 – 🗑️ DELETE USER

⬆ 返回目录

🗑️ 删除 User

添加到文件: index.js

app.delete('/users/:id', (req, res, next) => {
    try {
        const id = req.params.id;

        connection.query(
            'DELETE FROM `users` WHERE id = ?',
            [id],
            (err, results) => {
                if (err) {
                    return res.status(500).json({
                        message: "delete user was failed",
                        error: err.message
                    });
                }
                if (results.affectedRows === 0) {
                    return res.status(404).json({
                        message: "User not found"
                    });
                }
                res.status(200).json({
                    message: "dele

```javascript
router.delete("/:id", async (req, res) => {
    try {
        const { id } = req.params;
        const sql = "DELETE FROM users WHERE id = ?";
        db.query(sql, [id], (err, result) => {
            if (err) {
                return res.status(500).json({
                    message: "delete user was failed",
                    error: err.message
                });
            }
            if (result.affectedRows === 0) {
                return res.status(404).json({
                    message: "user not found"
                });
            }
            res.json({
                message: "delete user was successfully",
                payload: results
            });
        }
    );
} catch (error) {
    res.status(400).json({
        message: "delete user was failed",
        error: error.message
    });
}
});

🔍 代码说明

  • DELETE FROM – 用于删除数据的 SQL 语句
  • affectedRows – 被删除的行数 (0 = 未找到数据)

🧪 测试 API

DELETE http://localhost:5000/users/1

🎉 模块 2 小结

我们学习了如何在 Express 中连接和使用 MySQL 数据库,完整实现 CRUD 操作

方法端点描述
GET/users获取所有用户数据
GET/users/:id根据 id 获取用户数据
POST/users创建新用户
PUT/users/:id更新用户信息
DELETE/users/:id删除用户

参考

Back to Blog

相关文章

阅读更多 »