express4与mysql2的增删改查应用

241 阅读4分钟

一、下载导入模块

pnpm i express

pnpm i mysql2

const express = require("express");
const app = express();

app.use(express.json());

const MySQL = require("mysql2");


const 数据库 = MySQL.createConnection({
  host: "localhost", // 主机地址
  user: "root", // 用户名
  password: "123456", // 密码
  port: 3307, // 端口号,默认为 3306
  database: "教室数据", // 数据库名称
  connectTimeout: 10000, // 连接超时时间,单位为毫秒
  multipleStatements: false, // 是否允许一个 query 中有多个 MySQL 语句,默认为 false
});

app.use(express.json()) 是一个 Express 中间件函数,它的作用是解析传入的请求体,并将其转换为 JSON 格式

当客户端发送一个包含 JSON 数据的请求时,express.json() 中间件会解析请求体,并将其转换为 JavaScript 对象,使得我们可以在后续的处理程序中方便地访问和操作这些数据。`

二、链接数据库,启动服务器

node 文件名

测试链接是否正常

注:请先开启数据库再启动项目


数据库.connect((err) => {
  if (err) {
    console.error("连接数据库失败:", err.stack);
    return;
  }
  console.log("成功连接到数据库");
});

app.listen(3080, () => {
  console.log("服务器运行中");
  console.log("http://localhost:3080");
});

推荐使用Apifox进行接口测试

image.png

三、增删改查

1.增

app.post("/api/add", (req, res) => {
  console.log(req.query, req.params, req.body);

  let SQL =
    "INSERT INTO 信息表(ID,日期,时间,姓名,位置,信息) VALUES(?,?,?,?,?,?)";
  数据库.query(
    SQL,
    [
      req.body.ID,
      req.body.日期,
      req.body.时间,
      req.body.姓名,
      req.body.位置,
      req.body.信息,
    ],
    (err, result) => {
      if (err) {
        console.log(err);
        res.send("服务器错误");
      } else {
        //res.send("插入成功");
        res.send(JSON.stringify(result));
      }
    }
  );
});
请求与返回

请求的数据结构

{
  ID: 6872743656,
  '位置': '天津 天津市 河西区',
  '信息': '无',
  '姓名': '江艳',
  '日期': '1995-06-14',
  '时间': '2024-01-03 16:02:15'
}

返回的数据结构

{
    "fieldCount": 0,
    "affectedRows": 1,
    "insertId": 0,
    "info": "",
    "serverStatus": 2,
    "warningStatus": 0,
    "changedRows": 0
}
  • fieldCount:结果集中的字段数量。对于 INSERT、UPDATE 和 DELETE 查询,这个值通常为 0。
  • affectedRows:查询影响的行数。对于 INSERT、UPDATE 和 DELETE 查询,这是被插入、更新或删除的行数。
  • insertId:插入操作生成的自增 ID。如果查询是一个 INSERT 操作,并且插入的表有一个自增字段,那么这个值就是新插入的行的自增 ID。
  • info:包含额外信息的字符串,例如影响的行数、插入的 ID 等。
  • serverStatus:服务器状态的数字表示。这是一个从服务器返回的内部值,通常不需要在应用程序中使用。
  • warningStatus:警告的数量。如果查询产生了警告,这个值就是警告的数量。
  • changedRows:更新操作改变的行数。对于 UPDATE 查询,这是实际被改变的行数(即新值与旧值不同的行数)。注意这个值与 affectedRows 不同,affectedRows 是匹配 WHERE 子句条件的行数,而 changedRows 是实际被改变的行数。

image.png

2.删

app.post("/api/delete", (req, res) => {

  数据库.query(
    "DELETE FROM 信息表 WHERE ID = ?",
    [req.body.ID],
    (err, result) => {
      if (err) {
        console.log(err);
        res.send("服务器错误");
      } else {
        res.send("删除成功");
      }
    }
  );
});
请求与返回

请求的数据结构

{
  ID: 6872743656
}

返回的数据结构

{
    "fieldCount": 0,
    "affectedRows": 1,
    "insertId": 0,
    "info": "",
    "serverStatus": 2,
    "warningStatus": 0,
    "changedRows": 0
}

image.png

3.改

app.post("/api/update", (req, res) => {
  
  数据库.query(
    "UPDATE 信息表 SET 日期 = ?,时间 = ?,姓名 = ?,位置 = ?,信息 = ? WHERE ID = ?",
    [
      req.body.日期,
      req.body.时间,
      req.body.姓名,
      req.body.位置,
      req.body.信息,
      req.body.ID,
    ],
    (err, result) => {
      if (err) {
        console.log(err);
        res.send("服务器错误");
      } else {
        res.send("更新成功");
      }
    }
  );
});
请求与返回

请求的数据结构

{
  ID: 6872743656,
  '位置': '河西区',
  '信息': '无',
  '姓名': '大大',
  '日期': '1995-06-01',
  '时间': '2024-01-05 16:02:15'
}

返回的数据结构

{
    "fieldCount": 0,
    "affectedRows": 1,
    "insertId": 0,
    "info": "Rows matched: 1  Changed: 1  Warnings: 0",
    "serverStatus": 2,
    "warningStatus": 0,
    "changedRows": 1
}

image.png

4.查

app.post("/api/Query", (req, res) => {
  
  数据库.query(
    "SELECT * FROM 信息表 WHERE 日期 = ?",
    [req.body.日期],
    (err, result) => {
      if (err) {
        console.log(err);
        res.send("服务器错误");
      } else {
        res.send(result);
      }
    }
  );
});

image.png

完整代码

注:创建表时,如果设置了主键,并且主键是数字类型,实现自增,便不需要再传入ID值

const express = require("express");
const app = express();

const MySQL = require("mysql2");

app.use(express.json());

const 数据库 = MySQL.createConnection({
  host: "localhost", // 主机地址
  user: "root", // 用户名
  password: "123456", // 密码
  port: 3307, // 端口号,默认为 3306
  database: "教室数据", // 数据库名称
  connectTimeout: 10000, // 连接超时时间,单位为毫秒
  multipleStatements: false, // 是否允许一个 query 中有多个 MySQL 语句,默认为 false
});

数据库.connect((err) => {
  if (err) {
    console.error("连接数据库失败:", err.stack);
    return;
  }
  console.log("成功连接到数据库");
});

app.listen(3080, () => {
  console.log("服务器运行中");
  console.log("http://localhost:3080");
});

app.post("/api/Query", (req, res) => {
  console.log(req.body);
  数据库.query(
    "SELECT * FROM 信息表 WHERE 日期 = ?",
    [req.body.日期],
    (err, result) => {
      if (err) {
        console.log(err);
        res.send("服务器错误");
      } else {
        res.send(result);
      }
    }
  );
});

app.post("/api/add", (req, res) => {
  console.log(req.query, req.params, req.body);
  数据库.query(
    "INSERT INTO 信息表(ID,日期,时间,姓名,位置,信息) VALUES(?,?,?,?,?,?)",
    [
      req.body.ID,
      req.body.日期,
      req.body.时间,
      req.body.姓名,
      req.body.位置,
      req.body.信息,
    ],
    (err, result) => {
      if (err) {
        console.log(err);
        res.send("服务器错误");
      } else {
        res.send("插入成功");
      }
    }
  );
});

app.post("/api/delete", (req, res) => {
  console.log(req.query, req.params, req.body);
  数据库.query(
    "DELETE FROM 信息表 WHERE ID = ?",
    [req.body.ID],
    (err, result) => {
      if (err) {
        console.log(err);
        res.send("服务器错误");
      } else {
        res.send("删除成功");
      }
    }
  );
});

app.post("/api/update", (req, res) => {
  console.log(req.query, req.params, req.body);
  数据库.query(
    "UPDATE 信息表 SET 日期 = ?,时间 = ?,姓名 = ?,位置 = ?,信息 = ? WHERE ID = ?",
    [
      req.body.日期,
      req.body.时间,
      req.body.姓名,
      req.body.位置,
      req.body.信息,
      req.body.ID,
    ],
    (err, result) => {
      if (err) {
        console.log(err);
        res.send("服务器错误");
      } else {
        res.send("更新成功");
      }
    }
  );
});