mongo.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. // const { MongoClient } = require('mongodb');
  2. var express = require('express');
  3. var router = express.Router();
  4. const querystring = require('querystring');
  5. var us = {
  6. mongo: require('mongodb'),
  7. client: null // 用于存储 MongoClient 实例
  8. };
  9. // 初始化 MongoDB 连接
  10. us.initMongoConnection = async function (host, database) {
  11. if (!us.client) {
  12. const url = host; // MongoDB 连接地址
  13. us.client = new us.mongo.MongoClient(url, {
  14. useNewUrlParser: true,
  15. useUnifiedTopology: true,
  16. maxPoolSize: 50, // 降低连接池大小,避免资源耗尽
  17. minPoolSize: 5, // 设置最小连接数
  18. maxIdleTimeMS: 30000, // 连接最大空闲时间
  19. serverSelectionTimeoutMS: 5000,
  20. socketTimeoutMS: 45000,
  21. connectTimeoutMS: 10000, // 添加连接超时
  22. keepAlive: true, // 保持连接活跃
  23. keepAliveInitialDelay: 300000 // 保持连接初始延迟
  24. });
  25. try {
  26. await us.client.connect();
  27. } catch (err) {
  28. console.error("MongoDB 连接失败", err);
  29. throw err; // 抛出错误以便调用者处理
  30. }
  31. }
  32. return us.client.db(database); // 返回数据库实例
  33. }
  34. async function updateUserData(host, database, cename, data, res) {
  35. const db = await us.initMongoConnection(host, database); // 连接数据库
  36. try {
  37. const collection = db.collection(cename); // collection设置
  38. const dateKey = Object.keys(data)[0]; // 获取日期键
  39. const username = Object.keys(data[dateKey])[0]; // 获取用户ID
  40. console.log(`更新用户数据:${username}`);
  41. // 使用 upsert 更新或插入文档
  42. await collection.updateOne(
  43. { [dateKey]: { $exists: true } }, // 查询条件, [`${dateKey}.${username}`]: { $exists: true }
  44. {
  45. $push: { [`${dateKey}.${username}`]: data[dateKey][username] }, // 将用户数据推入数组
  46. },
  47. { upsert: true } // 如果没有数据,默认创建一条数据
  48. );
  49. console.log('数据更新成功');
  50. res.end(JSON.stringify({ status: "1" }))
  51. } catch (err) {
  52. res.end(JSON.stringify({ status: "0" }))
  53. console.error('更新失败', err);
  54. }
  55. }
  56. async function updateUserData2(host, database, cename, data, res) {
  57. const db = await us.initMongoConnection(host, database); // 连接数据库
  58. try {
  59. const collection = db.collection(cename); // collection设置
  60. const dateKey = Object.keys(data)[0]; // 获取日期键
  61. const userid = Object.keys(data[dateKey])[0];
  62. const userData = data[dateKey][userid]; // 从 data 中提取 userData
  63. console.log(userData);
  64. // 使用 upsert 更新或插入文档
  65. await collection.updateOne(
  66. { [dateKey]: { $exists: true } },
  67. {
  68. $set: {
  69. // 使用点符号逐个更新字段
  70. [`${dateKey}.${userid}.username`]: userData.username,
  71. [`${dateKey}.${userid}.org`]: userData.org,
  72. [`${dateKey}.${userid}.school`]: userData.school,
  73. [`${dateKey}.${userid}.browser`]: userData.browser,
  74. [`${dateKey}.${userid}.role`]: userData.role,
  75. }
  76. // 先更新用户信息
  77. },
  78. { upsert: true } // 如果没有数据,默认创建一条数据
  79. );
  80. // 然后推送操作到 operation 数组
  81. await collection.updateOne(
  82. { [dateKey]: { $exists: true } },
  83. {
  84. $push: { [`${dateKey}.${userid}.operation`]: { $each: userData.operation } } // 将用户数据推入数组
  85. },
  86. { upsert: true }
  87. );
  88. console.log('数据更新成功');
  89. res.end(JSON.stringify({ status: "1" }))
  90. } catch (err) {
  91. res.end(JSON.stringify({ status: "0", error: err.message })) // 返回错误信息
  92. console.error('更新失败', err);
  93. }
  94. }
  95. /*
  96. {
  97. "2025-04-01": {
  98. "userid": {
  99. username: "",
  100. org: "",
  101. school: "",
  102. browser: "",
  103. operation:[
  104. {
  105. "useTime":"",
  106. "loadTime":"",
  107. "object":"",
  108. "status":"error(报错信息)、正常就是success"
  109. }
  110. ]
  111. }
  112. }
  113. // 示例调用
  114. updateUserData2("mongodb://root:usestudio-1@123.58.32.151:11641?authSource=admin", "cocolog", "applog", {
  115. "2025-04-01": {
  116. "userid": {
  117. username: "1",
  118. org: "",
  119. school: "",
  120. browser: "",
  121. operation: [
  122. {
  123. "useTime": "",
  124. "loadTime": "",
  125. "object": "",
  126. "status": "error(报错信息)、正常就是success"
  127. }
  128. ]
  129. }
  130. }
  131. });
  132. */
  133. router.route('/updateUserData2').all((req, res, next) => {
  134. let today = new Date();
  135. let date = today.getFullYear() + '-' + (today.getMonth() + 1).toString().padStart(2, '0') + '-' + today.getDate().toString().padStart(2, '0');
  136. let data = req.body[0];
  137. if(!data.userid){
  138. res.end(JSON.stringify({ status: "无用户信息", json: req.body}))
  139. return;
  140. }
  141. let decryptedData = {};
  142. for (let key in data) {
  143. decryptedData[key] = decodeURIComponent(data[key]);
  144. }
  145. let json = {
  146. [date]: {
  147. [decryptedData.userid]:
  148. {
  149. username: decryptedData.username,
  150. accountNumber: decryptedData.accountNumber,
  151. org: decryptedData.org,
  152. school: decryptedData.school,
  153. browser: decryptedData.browser,
  154. role: decryptedData.role ? decryptedData.role : "",
  155. operation: [
  156. {
  157. useTime: decryptedData.userTime,
  158. loadTime: decryptedData.loadTime,
  159. endTime: decryptedData.endTime ? decryptedData.endTime : '',
  160. object: decryptedData.object,
  161. status: decryptedData.status,
  162. }
  163. ]
  164. }
  165. }
  166. }
  167. console.log(json);
  168. console.log(json[date][decryptedData.userid]['operation']);
  169. //172.16.9.240:27017
  170. //123.58.32.151:11641
  171. updateUserData2("mongodb://root:usestudio-1@172.16.9.240:27017?authSource=admin", "cocolog", "applog", json, res);
  172. });
  173. router.route('/updateUserData2P').all((req, res, next) => {
  174. let today = new Date();
  175. let date = today.getFullYear() + '-' + (today.getMonth() + 1).toString().padStart(2, '0') + '-' + today.getDate().toString().padStart(2, '0');
  176. let data = req.body;
  177. if(!data.userid){
  178. res.end(JSON.stringify({ status: "无用户信息", json: req.body}))
  179. return;
  180. }
  181. let decryptedData = {};
  182. for (let key in data) {
  183. decryptedData[key] = decodeURIComponent(data[key]);
  184. }
  185. let json = {
  186. [date]: {
  187. [decryptedData.userid]:
  188. {
  189. username: decryptedData.username,
  190. accountNumber: decryptedData.accountNumber,
  191. org: decryptedData.org,
  192. school: decryptedData.school,
  193. browser: decryptedData.browser,
  194. role: decryptedData.role ? decryptedData.role : "",
  195. operation: [
  196. {
  197. useTime: decryptedData.userTime,
  198. loadTime: decryptedData.loadTime,
  199. endTime: decryptedData.endTime ? decryptedData.endTime : '',
  200. object: decryptedData.object,
  201. status: decryptedData.status,
  202. }
  203. ]
  204. }
  205. }
  206. }
  207. console.log(json);
  208. console.log(json[date][decryptedData.userid]['operation']);
  209. //172.16.9.240:27017
  210. //123.58.32.151:11641
  211. updateUserData2("mongodb://root:usestudio-1@172.16.9.240:27017?authSource=admin", "cocolog", "applog", json, res);
  212. });
  213. router.route('/updateUserData').all((req, res, next) => {
  214. let today = new Date();
  215. let date = today.getFullYear() + '-' + (today.getMonth() + 1).toString().padStart(2, '0') + '-' + today.getDate().toString().padStart(2, '0');
  216. let data = req.body[0];
  217. let decryptedData = {};
  218. for (let key in data) {
  219. decryptedData[key] = decodeURIComponent(data[key]);
  220. }
  221. updateUserData("mongodb://root:usestudio-1@172.16.9.240:27017?authSource=admin", "cocolog", "applog", {
  222. [date]: {
  223. [decryptedData.username]: // 使用变量username作为键
  224. {
  225. userid: decryptedData.userid,
  226. accountNumber: decryptedData.accountNumber,
  227. date: today,
  228. appname: decryptedData.appname,
  229. appid: decryptedData.appid,
  230. status: decryptedData.status
  231. }
  232. }
  233. }, res);
  234. });
  235. queryString = function (url) {
  236. var a = url.split("?");
  237. var json = querystring.parse(a[1])
  238. return json;
  239. }
  240. module.exports = router;