NodeJS 101 — 第2部分 MySQL
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 service 或 RESTful API,并结合以下框架和库:
- 🌐 Express – 用于创建 Web 服务器的 HTTP 框架
- 🗄️ Sequelize – 用于管理数据库的 ORM
- 💾 MySQL – 关系型数据库
- 🔧 POSTMAN – API 测试工具
📚 目录
Module 2: 💾 Basic API MySQL
学习如何在 Express 中连接和使用 MySQL 数据库
Section 2‑1 – 🚀 创建新的 Express 和 MySQL 应用
📁 创建新项目
-
创建文件夹
demo-mysqlmkdir demo-mysql -
进入文件夹
demo-mysqlcd demo-mysql⚠️ 注意: 文档中出现的
cd mkdir demo-mysql命令不正确,创建文件夹后应使用cd demo-mysql -
创建 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
📋 已安装的包
| Package | Description |
|---|---|
express | Node.js 的 Web 框架 |
mysql2 | Node.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 /users 和 GET /users/:id 的模式,使用 INSERT、UPDATE、DELETE 通过 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 | 删除用户 |
参考