mongo.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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: 10000, // 设置连接池没有上限
  17. serverSelectionTimeoutMS: 5000, // 服务器选择超时
  18. socketTimeoutMS: 45000 // 套接字超时
  19. });
  20. try {
  21. await us.client.connect();
  22. } catch (err) {
  23. console.error("MongoDB 连接失败", err);
  24. throw err; // 抛出错误以便调用者处理
  25. }
  26. }
  27. return us.client.db(database); // 返回数据库实例
  28. }
  29. /*
  30. async function updateUserData(host, database, cename, data, res) {
  31. const db = await us.initMongoConnection(host, database); // 连接数据库
  32. try {
  33. const collection = db.collection(cename); // collection设置
  34. const dateKey = Object.keys(data)[0]; // 获取日期键
  35. const username = Object.keys(data[dateKey])[0]; // 获取用户ID
  36. console.log(`更新用户数据:${username}`);
  37. // 使用 upsert 更新或插入文档
  38. await collection.updateOne(
  39. { [dateKey]: { $exists: true } }, // 查询条件, [`${dateKey}.${username}`]: { $exists: true }
  40. {
  41. $push: { [`${dateKey}.${username}`]: data[dateKey][username] }, // 将用户数据推入数组
  42. },
  43. { upsert: true } // 如果没有数据,默认创建一条数据
  44. );
  45. console.log('数据更新成功');
  46. res.end(JSON.stringify({ status: "1" }))
  47. } catch (err) {
  48. res.end(JSON.stringify({ status: "0" }))
  49. console.error('更新失败', err);
  50. }
  51. }
  52. */
  53. async function updateUserData(host, database, cename, data, res) {
  54. const db = await us.initMongoConnection(host, database); // 连接数据库
  55. try {
  56. const collection = db.collection(cename); // collection设置
  57. const dateKey = Object.keys(data)[0]; // 获取日期键
  58. const userid = Object.keys(data[dateKey])[0];
  59. const userData = data[dateKey][userid]; // 从 data 中提取 userData
  60. console.log(userData);
  61. // 使用 upsert 更新或插入文档
  62. await collection.updateOne(
  63. { [dateKey]: { $exists: true } },
  64. {
  65. $set: { // 设置其他字段
  66. [`${dateKey}.${userid}`]: {
  67. username: userData.username,
  68. org: userData.org,
  69. school: userData.school,
  70. browser: userData.browser
  71. }
  72. },
  73. // 先更新用户信息
  74. },
  75. { upsert: true } // 如果没有数据,默认创建一条数据
  76. );
  77. // 然后推送操作到 operation 数组
  78. await collection.updateOne(
  79. { [dateKey]: { $exists: true } },
  80. {
  81. $push: { [`${dateKey}.${userid}.operation`]: userData.operation } // 将用户数据推入数组
  82. }
  83. );
  84. console.log('数据更新成功');
  85. //res.end(JSON.stringify({ status: "1" }))
  86. } catch (err) {
  87. //res.end(JSON.stringify({ status: "0", error: err.message })) // 返回错误信息
  88. console.error('更新失败', err);
  89. }
  90. }
  91. /*
  92. {
  93. "2025-04-01": {
  94. "userid": {
  95. username: "",
  96. org: "",
  97. school: "",
  98. browser: "",
  99. operation:[
  100. {
  101. "useTime":"",
  102. "loadTime":"",
  103. "object":"",
  104. "status":"error(报错信息)、正常就是success"
  105. }
  106. ]
  107. }
  108. }
  109. // 示例调用
  110. updateUserData("mongodb://root:usestudio-1@123.58.32.151:11641?authSource=admin", "cocolog", "applog", {
  111. "2025-04-01": {
  112. "userid": {
  113. username: "",
  114. org: "",
  115. school: "",
  116. browser: "",
  117. operation: [
  118. {
  119. "useTime": "",
  120. "loadTime": "",
  121. "object": "",
  122. "status": "error(报错信息)、正常就是success"
  123. }
  124. ]
  125. }
  126. }
  127. });
  128. */
  129. //查找有无学校
  130. router.route('/updateUserData').all((req, res, next) => {
  131. let today = new Date();
  132. let date = today.getFullYear() + '-' + (today.getMonth() + 1).toString().padStart(2, '0') + '-' + today.getDate().toString().padStart(2, '0');
  133. let data = req.body[0];
  134. let decryptedData = {};
  135. for (let key in data) {
  136. decryptedData[key] = decodeURIComponent(data[key]);
  137. }
  138. updateUserData("mongodb://root:usestudio-1@172.16.9.240:27017?authSource=admin", "cocolog", "applog", {
  139. [date]: {
  140. [decryptedData.username]: // 使用变量username作为键
  141. {
  142. userid: decryptedData.userid,
  143. accountNumber: decryptedData.accountNumber,
  144. date: today,
  145. appname: decryptedData.appname,
  146. appid: decryptedData.appid,
  147. status: decryptedData.status
  148. }
  149. }
  150. }, res);
  151. });
  152. queryString = function (url) {
  153. var a = url.split("?");
  154. var json = querystring.parse(a[1])
  155. return json;
  156. }
  157. module.exports = router;