requestLog.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. const path = require('path')
  2. const db = require("../plugin/DataBase/db")
  3. const Logger = require('./Logger')
  4. const ipSearcher = require('../plugin/ip2region')
  5. class RequestLog {
  6. constructor() {
  7. this.logger = new Logger()
  8. this.searcher = ipSearcher.newWithFileOnly(path.join(__dirname, '../plugin/ip2region/ip2region.xdb'))
  9. }
  10. async insertLog(req, res, namespace, method) {
  11. try {
  12. const time = new Date().getTime()
  13. const ip = this.getClientIp(req)
  14. const ipData = await this.searcher.search(ip).region ?? '未知'
  15. const userAgent = req.headers['user-agent']
  16. const deviceType = req.headers['device-type'] ?? '浏览器'
  17. let reqData
  18. if (method === 'get') {
  19. reqData = req.query
  20. } else {
  21. reqData = req.body
  22. }
  23. let sql = 'INSERT INTO requestLog (create_user, create_time, method, reqData, code, ip, ua, deviceType, apiName, location) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
  24. let r = await db.query(sql, [reqData.uuid ?? '', time, method, reqData, res.code, ip, userAgent, deviceType, namespace ?? '未知', ipData])
  25. if (!r || r.affectedRows !== 1)
  26. this.logger.error(`插入日志信息失败!数据库错误`)
  27. } catch (error) {
  28. this.logger.error(`插入日志信息失败!${error}`)
  29. }
  30. }
  31. getClientIp(req) {
  32. let ip = null;
  33. if (req.headers['x-forwarded-for']) {
  34. ip = req.headers['x-forwarded-for'].split(',')[0].trim();
  35. } else if (req.headers['x-real-ip']) {
  36. ip = req.headers['x-real-ip'];
  37. } else {
  38. ip = req.connection.remoteAddress || '';
  39. }
  40. // 如果是 IPv6 映射的 IPv4 (::ffff:x.x.x.x),提取后面的 IPv4
  41. if (ip.startsWith("::ffff:")) {
  42. ip = ip.replace("::ffff:", "");
  43. }
  44. // 如果是 [::1] 或其他 IPv6,可以按需过滤掉
  45. const ipv4Regex = /^(\d{1,3}\.){3}\d{1,3}$/;
  46. if (!ipv4Regex.test(ip)) {
  47. return null; // 非 IPv4 返回 null 或者你可以保留原值
  48. }
  49. return ip;
  50. }
  51. }
  52. module.exports = RequestLog