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

如何在Node.js web应用中监听条形码扫描仪输入并执行对应操作

条码扫描仪监听实现方案

客户端全局监听(扫描枪连接访问端设备,无表单依赖)

绝大多数商用条码扫描仪默认模拟USB HID键盘输入,扫描完成后会自动追加回车符作为输入结束标识,无需绑定HTML表单,直接在前端全局监听键盘事件即可捕获输入,逻辑如下:

  • 维护临时输入缓冲区,通过输入间隔区分人工打字和扫描枪输入(扫描枪单次字符输入间隔通常<10ms,远低于人工打字速度)
  • 检测到回车符时判定为扫描完成,触发后续HTTP请求逻辑

前端代码示例(直接嵌入EJS模板的<script>标签即可):

// 扫描缓冲区
let scanBuffer = [];
let lastInputTime = 0;

document.addEventListener('keypress', (e) => {
  const currentTime = Date.now();
  // 间隔超过30ms判定为人工输入,清空缓冲区
  if (currentTime - lastInputTime > 30) {
    scanBuffer = [];
  }
  lastInputTime = currentTime;

  // 回车符代表扫描结束
  if (e.key === 'Enter') {
    if (scanBuffer.length > 0) {
      const barcode = scanBuffer.join('');
      scanBuffer = [];
      // 触发自定义操作,例如发起GET请求
      fetch(`/api/handle-scan?code=${encodeURIComponent(barcode)}`)
        .then(res => res.json())
        .then(data => {
          // 处理返回结果
        });
    }
    e.preventDefault();
    return;
  }
  // 普通字符加入缓冲区
  scanBuffer.push(e.key);
});

服务端本地监听(扫描枪连接Express服务所在设备)

如果扫描仪直接插在运行Node服务的主机上,可以通过Node的HID设备读取库直接捕获输入,无需依赖前端页面:

  1. 安装依赖包
npm install node-hid
  1. 服务端监听代码示例
const HID = require('node-hid');
const express = require('express');
const app = express();

// 获取所有HID设备,找到你的条码扫描仪的vid/pid
const devices = HID.devices();
const scanner = devices.find(dev => dev.product.includes('Barcode') || dev.manufacturer.includes('Scanner'));

if (scanner) {
  const device = new HID.HID(scanner.path);
  let scanBuffer = [];

  device.on('data', (data) => {
    // 转换HID扫描码为字符,不同设备映射规则可能有差异,可根据实际设备调整
    const char = mapHidCodeToChar(data[2]);
    if (char === 'ENTER') {
      const barcode = scanBuffer.join('');
      scanBuffer = [];
      // 触发对应操作,例如调用内部服务逻辑
      handleBarcode(barcode);
      return;
    }
    if (char) scanBuffer.push(char);
  });

  device.on('error', (err) => {
    console.error('扫描仪读取错误:', err);
  });
}

// 你的业务处理逻辑
function handleBarcode(barcode) {
  console.log('收到扫描条码:', barcode);
  // 自定义逻辑实现
}

app.listen(3000, () => console.log('服务运行在3000端口'));

// HID扫描码转字符映射(简化示例,可根据实际设备补充完整)
function mapHidCodeToChar(code) {
  const map = {
    4: 'a',5: 'b',6: 'c',7: 'd',8: 'e',9: 'f',10: 'g',11: 'h',12: 'i',13: 'j',
    14: 'k',15: 'l',16: 'm',17: 'n',18: 'o',19: 'p',20: 'q',21: 'r',22: 's',
    23: 't',24: 'u',25: 'v',26: 'w',27: 'x',28: 'y',29: 'z',30: '1',31: '2',
    32: '3',33: '4',34: '5',35: '6',36: '7',37: '8',38: '9',39: '0',40: 'ENTER'
  };
  return map[code] || null;
}

注意事项

  • 客户端全局监听仅在页面处于激活状态时生效,如果需要后台无感监听,可以将前端代码打包为Electron应用,使用Electron的系统级输入监听能力实现后台捕获
  • 服务端监听方案需要处理操作系统的设备权限问题,Linux环境下需要配置udev规则开放扫描仪设备的非root访问权限
  • 两种方案都建议添加条码去重逻辑,避免同一条码被重复触发处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:09:03