Parcourir la source

feat: 添加通用SQL执行工具和对应API路由

1. 新增mysql.js的usquery通用SQL执行方法
2. 新增mysql-pbl.js的express API路由,提供直接执行SQL的接口
3. 在app.js中注册mysql-pbl路由并注释本地MongoDB连接配置
lsc il y a 4 jours
Parent
commit
b79b4304d1
3 fichiers modifiés avec 147 ajouts et 34 suppressions
  1. 36 34
      app.js
  2. 75 0
      mysql-pbl.js
  3. 36 0
      mysql.js

+ 36 - 34
app.js

@@ -4,6 +4,7 @@ var app = express();                 // define our app using express
 var bodyParser = require('body-parser');
 var request = require("request");
 const edurouter = require('./pbl');
+const medurouter = require('./mysql-pbl');
 const mongo = require('./mongo');
 const weixin = require('./weixin');
 const cocoflow = require('./cocoflow');
@@ -45,45 +46,45 @@ app.use(function (req, res, next) {
 let local = 'mongodb://root:usestudio-1@172.16.9.240:27017?authSource=admin'
 // let local = 'mongodb://root:usestudio-1@183.36.26.8:11641/cocorobo?authSource=admin'
 
-mongoose.connect(local, {
-    dbName: 'cocorobo',
-    useNewUrlParser: true,
-    useUnifiedTopology: true,
-    useCreateIndex: true,
-    useFindAndModify: true,
-    autoIndex: false, // Don't build indexes
-    reconnectTries: Number.MAX_VALUE, // Never stop trying to reconnect
-    reconnectInterval: 50000, // Reconnect every 500ms
-    poolSize: 10000, // Maintain up to 10 socket connections
-    // If not connected, return errors immediately rather than waiting for reconnect
-    bufferMaxEntries: 0,
-    connectTimeoutMS: 10000, // Give up initial connection after 10 seconds
-    socketTimeoutMS: 45000, // Close sockets after 45 seconds of inactivity
-    family: 4 // Use IPv4, skip trying IPv6
-  })
+// mongoose.connect(local, {
+//     dbName: 'cocorobo',
+//     useNewUrlParser: true,
+//     useUnifiedTopology: true,
+//     useCreateIndex: true,
+//     useFindAndModify: true,
+//     autoIndex: false, // Don't build indexes
+//     reconnectTries: Number.MAX_VALUE, // Never stop trying to reconnect
+//     reconnectInterval: 50000, // Reconnect every 500ms
+//     poolSize: 10000, // Maintain up to 10 socket connections
+//     // If not connected, return errors immediately rather than waiting for reconnect
+//     bufferMaxEntries: 0,
+//     connectTimeoutMS: 10000, // Give up initial connection after 10 seconds
+//     socketTimeoutMS: 45000, // Close sockets after 45 seconds of inactivity
+//     family: 4 // Use IPv4, skip trying IPv6
+//   })
   
-  const db = mongoose.connection;
+//   const db = mongoose.connection;
 
 // 配置session,使用MongoDB存储session数据
 // MongoDB连接字符串,使用与mongo.js中相同的连接方式
 // 注意:需要根据实际的MongoDB连接信息调整
-app.use(session({
-    name: "cocorobo",
-    secret: 'cocorobo',
-    resave: true,
-    saveUninitialized: true,
-    cookie: {
-        sameSite: "None",
-        domain: '.cocorobo.cn',
-        httpOnly: false,
-        secure: false, // 根据实际情况调整,如果是HTTPS则设为true
-        maxAge: 24 * 60 * 60000 * 365
-    },
-    store: new MongoStore({
-        mongooseConnection: db,
-        touchAfter: 24 * 3600
-      }),
-}));
+// app.use(session({
+//     name: "cocorobo",
+//     secret: 'cocorobo',
+//     resave: true,
+//     saveUninitialized: true,
+//     cookie: {
+//         sameSite: "None",
+//         domain: '.cocorobo.cn',
+//         httpOnly: false,
+//         secure: false, // 根据实际情况调整,如果是HTTPS则设为true
+//         maxAge: 24 * 60 * 60000 * 365
+//     },
+//     store: new MongoStore({
+//         mongooseConnection: db,
+//         touchAfter: 24 * 3600
+//       }),
+// }));
 /*
 app.use(cors({
     origin:[`http:${config.local.origin}`,'http://www.cocorobo.hk','https://cocorobo.hk','http://cloud.cocorobo.hk','https://cloud.cocorobo.hk'],
@@ -95,6 +96,7 @@ app.use(cors({
 
 // all of our routes will be prefixed with /api
 app.use('/api/pbl', edurouter);
+app.use('/api/mysql-pbl', medurouter);
 app.use('/api/mongo', mongo);
 app.use('/api/weixin', weixin);
 app.use('/api/cocoflow', cocoflow);

+ 75 - 0
mysql-pbl.js

@@ -0,0 +1,75 @@
+// ROUTES FOR OUR API(直接执行 SQL 语句)
+// =============================================================================
+var express = require("express");
+var request = require("request");
+var bcrypt = require("bcryptjs");
+var router = express.Router(); // get an instance of the express Router
+const querystring = require("querystring");
+var mysql = require("./mysql");
+
+//=====================================
+// 本地
+
+const _mysqlLabor = ["183.36.26.8", "pbl"]; //edu數據庫信息
+const _mysqluser = ["183.36.26.8", "cocorobouser"]; //用户数据库信息
+const _getmysqlLabor2 = ["183.36.26.8", "pbl"]; //edu數據庫信息
+const _getmysqlLabor = ["183.36.26.8", "pbl"]; //edu數據庫信息
+
+
+//线上
+// const _mysqlLabor = ["172.16.12.5", "pbl"]; //edu數據庫信息
+// const _mysqluser = ["172.16.12.5", "cocorobouser"]; //用户数据库信息
+// const _getmysqlLabor = ["172.16.12.7", "pbl"]; //edu數據庫信息
+// const _getmysqluser = ["172.16.12.7", "cocorobouser"]; //用户数据库信息
+//======================================
+
+//解析 url 查询参数
+function queryString(url) {
+    var a = url.split("?");
+    var json = querystring.parse(a[1]);
+    return json;
+}
+
+//直接执行 SQL(pbl 库)
+function runPbl(res, sql, params, isRead) {
+    var cfg = isRead ? _getmysqlLabor : _mysqlLabor;
+    var p = [cfg[0], cfg[1], sql].concat(params || []);
+    mysql.usquery(p, function (ret) {
+        res.end(JSON.stringify(ret));
+    });
+}
+
+//直接执行 SQL(cocorobouser 库)
+function runUser(res, sql, params, isRead) {
+    var cfg = isRead ? _getmysqluser : _mysqluser;
+    var p = [cfg[0], cfg[1], sql].concat(params || []);
+    mysql.usquery(p, function (ret) {
+        res.end(JSON.stringify(ret));
+    });
+}
+
+/* 查询用户(按 userid) */
+router.route("/selectUser").all((req, res, next) => {
+    var json = queryString(req.url);
+    var sql = "SELECT * FROM User WHERE userid = ?";
+    runPbl(res, sql, [json["uid"]], true);
+});
+
+/* 查询全部用户 */
+router.route("/selectUserAll").all((req, res, next) => {
+    var json = queryString(req.url);
+    var page = parseInt(json["page"]) || 1;
+    var pageSize = parseInt(json["pageSize"]) || 10;
+    var offset = (page - 1) * pageSize;
+    var sql = "SELECT * FROM User LIMIT ? OFFSET ?";
+    runPbl(res, sql, [pageSize, offset], true);
+});
+
+/* 修改用户 */
+router.route("/updateUser").post((req, res, next) => {
+    var json = req.body;
+    var sql = "UPDATE User SET username = ? WHERE userid = ?";
+    runPbl(res, sql, [json["username"], json["userid"]], false);
+});
+
+module.exports = router;

+ 36 - 0
mysql.js

@@ -99,6 +99,42 @@ exports.usselect = function (param, callback) {
 }
 
 
+//直接执行SQL语句
+//参数格式:[host, database, sql, ...params]  sql 为带占位符的原生 SQL,params 为对应参数
+exports.usquery = function (param, callback) {
+    if (param.length > 2) {
+        var _mysqlconnection = us.mysqlconnection(param[0], param[1]); //创建连接池
+        _mysqlconnection.getConnection(function (error, connection) { //获取连接
+            if (error) { //连接错误
+                console.log("连接失败:", error);
+                callback(error);
+            } else { //连接成功
+                var _sql = param[2]; //原生 SQL 语句
+                var _param = param.length > 3 ? param.slice(3) : []; //SQL 参数
+                connection.query(_sql, _param, function (error, results, fields) { //执行sql语句
+                    if (results) {
+                        //results.affectedRows != null 如果受影响行不等于null(空) 则返回受影响行数
+                        //results.length > 1 ? results : results[0] 如果结果集为单行则直接返回Object对象 否则返回数组对象
+                        callback(results.affectedRows != null ? results.affectedRows : results.length > 1 ? results : results[0]);
+                    } else { //执行错误
+                        console.log("sql执行失败", error || "");
+                        callback(error);
+                    }
+                });
+
+                connection.release(function (error) { //释放资源
+                    if (error) {
+                        console.log("连接释放错误", error)
+                        callback(error);
+                    };
+                });
+
+            }
+        });
+    }
+}
+
+
 //重新连接处理
 // us.mysqlconnet.reconnection = function (host, database, error) {
 //     if (error) {