Bladeren bron

nodejs数据库表数据读取

liujiejie 6 maanden geleden
bovenliggende
commit
35870d1a5e
2 gewijzigde bestanden met toevoegingen van 135 en 0 verwijderingen
  1. 115 0
      sever/index.js
  2. 20 0
      sever/package.json

+ 115 - 0
sever/index.js

@@ -0,0 +1,115 @@
+import express from "express";
+import mysql from "mysql2/promise";
+import timeout from "connect-timeout";
+import bodyParser from "body-parser";
+const app = express();
+const PORT = 3000;
+
+// 设置请求超时,单位为毫秒(比如:设置 30 秒超时)
+app.use(timeout("30s"));
+app.use(bodyParser.json()); // 在请求处理之前,先解析JSON
+// 处理超时请求
+app.use((req, res, next) => {
+  if (req.timedout) {
+    return res.status(408).send("Request Timeout");
+  }
+  next();
+});
+
+// 获取表和字段信息
+app.get("/tables", async (req, res) => {
+  let pool;
+  try {
+    const { IP, host, baseName, username, password } = req.query;
+    // 数据库连接配置
+    pool = mysql.createPool({
+      host: IP,
+      user: username,
+      password: password,
+      database: baseName,
+      port: host,
+    });
+    const connection = await pool.getConnection();
+    const [tables] = await connection.query("SHOW TABLES");
+    const tableFieldMap = {};
+    for (const table of tables) {
+      const tableName = Object.values(table)[0];
+      const [fields] = await connection.query(`DESCRIBE ${tableName}`);
+      tableFieldMap[tableName] = fields.map((field) => field.Field);
+    }
+    connection.release();
+    res.json(tableFieldMap);
+  } catch (error) {
+    // console.error("Error fetching database structure:", error);
+    res.status(500).send("请检查填写的数据库数据是否有误" + error);
+  } finally {
+    // 确保关闭数据库连接池
+    if (pool) {
+      await pool.end();
+    }
+  }
+});
+app.post("/filterTablesData", async (req, res) => {
+  try {
+    console.log(req.params, req.body, "req.query.filterData");
+    const { IP, host, baseName, username, password } = req.body.database;
+    const filterData = req.body.filterData;
+    // 数据库连接配置
+    const pool = mysql.createPool({
+      host: IP,
+      user: username,
+      password: password,
+      database: baseName,
+      port: host,
+    });
+    // 获取数据库连接;
+    const connection = await pool.getConnection();
+    // 用于存储最终查询结果
+    const resultData = {};
+    // 遍历 filterData
+    for (const item of filterData) {
+      const parentNode = item.parentNode; // 数据表名
+      const checkChildNode = item.checkChildNode; // 要查询的字段
+
+      // 检查表是否存在
+      const [tables] = await connection.query("SHOW TABLES");
+      const tableNames = tables.map((row) => Object.values(row)[0]);
+      if (!tableNames.includes(parentNode)) {
+        continue; // 如果表不存在,跳过
+      }
+
+      // 获取表字段信息
+      const [columns] = await connection.query(
+        `SHOW COLUMNS FROM ${parentNode}`
+      );
+      const tableFields = columns.map((column) => column.Field);
+
+      // 过滤存在的字段
+      const validFields = checkChildNode.filter((field) =>
+        tableFields.includes(field)
+      );
+      if (validFields.length === 0) {
+        continue; // 如果没有匹配的字段,跳过
+      }
+
+      // 动态查询字段的数据
+      const sqlQuery = `SELECT ${validFields.join(
+        ", "
+      )} FROM ${parentNode} LIMIT 100`; // 限制查询 100 条数据
+      const [rows] = await connection.query(sqlQuery);
+
+      // 保存结果
+      resultData[parentNode] = rows;
+    }
+    // 释放连接
+    connection.release();
+    // 返回最终数据
+    res.json(resultData);
+  } catch (error) {
+    console.error(error);
+    res.status(500).send("Error fetching data from database");
+  }
+});
+app.listen(PORT, () => {
+  console.log(`Server is running on http://localhost:${PORT}`);
+});

+ 20 - 0
sever/package.json

@@ -0,0 +1,20 @@
+{
+  "name": "sever",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "type": "module",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1",
+    "start": "nodemon index.js"
+  },
+  "keywords": [],
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "body-parser": "^1.20.3",
+    "connect-timeout": "^1.9.0",
+    "express": "^4.21.1",
+    "mysql2": "^3.11.5"
+  }
+}