track.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. const express = require('express');
  2. const router = express.Router();
  3. const UAParser = require('ua-parser-js');
  4. const geoip = require('geoip-lite');
  5. const Track = require('../models/track');
  6. // 埋点上报接口
  7. router.post('/', async (req, res) => {
  8. try {
  9. const body = req.body || {};
  10. const headers = req.headers || {};
  11. const userAgentStr = body.userAgent || headers['user-agent'] || '';
  12. const parser = new UAParser(userAgentStr);
  13. const uaResult = parser.getResult();
  14. // IP获取与地理位置解析
  15. let ip = body.IP || req.ip || headers['x-forwarded-for'] || '';
  16. if (ip && ip.includes(',')) ip = ip.split(',')[0].trim();
  17. if (ip.startsWith('::ffff:')) ip = ip.replace('::ffff:', '');
  18. const geo = geoip.lookup(ip) || {};
  19. // 只保留 TrackSchema 中定义的字段
  20. const data = {
  21. // 用户与会话
  22. userId: body.userId || '',
  23. // 事件与页面
  24. event: body.event || '',
  25. // 页面信息
  26. pageUrl: body.pageUrl || '',
  27. pageTitle: body.pageTitle || '',
  28. // 设备与环境
  29. userAgent: userAgentStr,
  30. browser: uaResult.browser.name || '',
  31. browserVersion: uaResult.browser.version || '',
  32. os: uaResult.os.name || '',
  33. osVersion: uaResult.os.version || '',
  34. language: body.language || headers['accept-language'] || '',
  35. platform: body.platform || uaResult.os.name || '',
  36. // 网络与地理
  37. IP: ip,
  38. country: geo.country || '',
  39. province: geo.region || '',
  40. city: geo.city || '',
  41. // 扩展相关
  42. extensionVersion: body.extensionVersion || '',
  43. tool_name: body.tool_name || '',
  44. };
  45. await Track.create(data);
  46. res.json({ code: 0, msg: '上报成功' });
  47. } catch (err) {
  48. console.error('埋点上报失败:', err);
  49. res.status(500).json({ code: 1, msg: '上报失败' });
  50. }
  51. });
  52. module.exports = router;