You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js Express服务端如何检测API请求的浏览器类型并区分终端?

在Express中检测浏览器类型与设备类型(桌面/平板)

嘿,这个需求我太熟了!在Express服务端区分桌面、平板请求并识别浏览器类型,核心就是解析请求头里的User-Agent字段。下面给你两种实用方案,手动解析和用成熟库,按需选就行。

方案一:手动解析User-Agent(适合简单场景)

如果你的需求不复杂,不想引入额外依赖,可以自己写个简单的中间件来解析。核心就是通过正则匹配UA里的关键词。

比如下面这个中间件,会把解析后的设备类型和浏览器信息挂载到req对象上,后续路由里直接用就行:

// 自定义UA解析中间件
app.use((req, res, next) => {
  const userAgent = req.headers['user-agent'] || '';
  
  // 检测设备类型:桌面/平板
  let deviceType = 'desktop';
  // 匹配常见平板的UA关键词(iPad、Android平板等)
  const isTablet = /(iPad|Android(?!.*Mobile)|Tablet|Kindle|Silk)/i.test(userAgent);
  if (isTablet) {
    deviceType = 'tablet';
  }
  
  // 检测浏览器类型
  let browser = 'unknown';
  if (/Chrome/i.test(userAgent)) browser = 'chrome';
  else if (/Safari/i.test(userAgent) && !/Chrome/i.test(userAgent)) browser = 'safari';
  else if (/Firefox/i.test(userAgent)) browser = 'firefox';
  else if (/Edge/i.test(userAgent)) browser = 'edge';
  // 可以继续加其他浏览器的匹配规则
  
  // 挂载到req对象,后续路由可用
  req.deviceInfo = {
    type: deviceType,
    browser: browser
  };
  
  next();
});

// 示例路由
app.get('/api/data', (req, res) => {
  const { type: deviceType, browser } = req.deviceInfo;
  console.log(`请求来自${deviceType}设备,浏览器是${browser}`);
  
  if (deviceType === 'tablet') {
    // 平板请求的逻辑
    res.json({ message: '这是平板专属响应', data: [] });
  } else {
    // 桌面请求的逻辑
    res.json({ message: '这是桌面专属响应', data: [] });
  }
});

不过手动解析的缺点也很明显:新的设备或浏览器出来时,你得自己更新正则,容易漏判。如果是生产环境,更推荐用成熟的库。

方案二:使用专业库(推荐生产环境)

有几个专门解析UA的npm包,比如ua-parser-js或者useragent,它们维护了大量的设备和浏览器规则,准确率高。这里以ua-parser-js为例,步骤如下:

  1. 先安装依赖:
npm install ua-parser-js
  1. 写一个中间件来解析:
const { UAParser } = require('ua-parser-js');

// UA解析中间件
app.use((req, res, next) => {
  const parser = new UAParser(req.headers['user-agent']);
  const result = parser.getResult();
  
  // 整理设备类型:区分桌面和平板
  let deviceType = 'desktop';
  // parser返回的device.type可能是'console'、'mobile'、'tablet'、'smarttv'等,我们只关注tablet和桌面
  if (result.device.type === 'tablet') {
    deviceType = 'tablet';
  } else if (result.device.type === undefined && !/Mobile/i.test(req.headers['user-agent'])) {
    // 没有检测到设备类型且不是移动设备,默认桌面
    deviceType = 'desktop';
  }
  
  // 整理浏览器信息
  const browser = result.browser.name || 'unknown';
  
  req.deviceInfo = {
    type: deviceType,
    browser: browser,
    // 还可以加更多信息,比如操作系统:result.os.name
  };
  
  next();
});

// 示例路由使用
app.get('/api/user', (req, res) => {
  const { type: deviceType, browser } = req.deviceInfo;
  res.json({
    message: `你正在用${browser}浏览器,设备类型是${deviceType}`,
    // 根据设备类型返回不同数据
    data: deviceType === 'tablet' ? ['平板数据1', '平板数据2'] : ['桌面数据1', '桌面数据2']
  });
});

这个库会帮你处理各种复杂的UA情况,比如有些Android平板的UA不带Mobile关键词,它能准确识别出来,比手动正则靠谱多了。

注意事项

  • User-Agent是可以伪造的,所以如果是涉及安全的场景,不能完全依赖它,但一般的API适配场景完全够用。
  • 如果你需要区分手机和平板,上面的代码已经处理了,result.device.type为'mobile'就是手机,'tablet'是平板。
  • 定期更新依赖库,因为新的设备和浏览器会不断出现,库的维护者会更新规则。

内容的提问来源于stack exchange,提问作者iamntg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:26:11