今天掌握了
mysql2的核心查询方式:?占位符,并理解了它将来如何与 Express 的req.params.id配合,实现动态接口。
一、今日核心代码
1. 带参数查询(单个用户)
javascript
const mysql = require('mysql2');
const connection = mysql.createConnection({
host: 'localhost',
port: 3307, // 无人机项目专用数据库
user: 'root',
password: 'you_password',//输入自己的端口密码
database: 'drone_platform'
});
// 带参数的查询(核心)
const userId = 1; // 将来它来自 req.params.id
const sqlOne = "SELECT * FROM users WHERE id = ?";
connection.query(sqlOne, [userId], (err, results) => {
if (err) throw err;
console.log("id 为 1 的用户:", results[0]); // results 是数组,取第一个
});
connection.end();
2. 查询所有用户(复习)
javascript
const sqlAll = "SELECT * FROM users";
connection.query(sqlAll, (err, results) => {
if (err) {
console.log('查询失败:', err.message);
return;
}
console.log('📋 users 表数据:', results);
});
二、今日核心理解
| 概念 | 解释 |
|---|---|
? 占位符 | SQL 语句中的占位标记,用于动态传入值 |
[userId] | 替换 ? 的数组,按顺序一一对应 |
results[0] | 查询结果始终是数组,取第一条数据用 [0] |
req.params.id | Express 中获取动态路由 /users/:id 的 id 值 |
connection.end() | 关闭数据库连接,否则进程不会自动退出 |
三、? 占位符与 Express 动态路由的关系
现在写的:
javascript
const userId = 1;
connection.query("SELECT * FROM users WHERE id = ?", [userId], ...);
后面整合到 Express 接口时:
javascript
app.get('/users/:id', (req, res) => {
const userId = req.params.id; // 从 URL 获取动态 id
const sql = "SELECT * FROM users WHERE id = ?";
connection.query(sql, [userId], (err, results) => {
res.json(results[0]);
});
});
用户访问 /users/1 → 返回 id=1 的用户数据。
? 占位符是连接“动态路由”和“数据库查询”的桥梁。
四、今日踩的坑 & 解决
| 坑 | 原因 | 解决 |
|---|---|---|
进程一直不退出,需按 Ctrl + C | 没有调用 connection.end() | 查询完成后执行 connection.end() |
变量拼写错误(如 USERS 写成 USRRS) | VS Code 不检查 SQL 里的表名和列名 | 对照数据库里的真实表名手打,或安装 SQL 插件 |
PowerShell 跑 node 权限报错 | Windows 执行策略限制 | 切换成 cmd 终端(VS Code 下拉选择) |
| 查询结果取不到值 | 忘记 results 是数组,直接用了 results.id | 用 results[0].id 或解构 |
| 多个占位符传值错误 | 数组顺序与 ? 顺序不一致 | 确保 [值1, 值2] 与 SQL 中 ? 的顺序一致 |
五、今日小成就
- 独立完成带参数查询(
WHERE id = ?) - 理解
results始终是数组,取第一条用[0] - 理解将来如何与
req.params.id结合 - 知道
connection.end()的作用和必要性 - 从 PowerShell 切到 cmd 解决权限问题
- 手打 SQL 多遍,加深期末语法记忆