如何在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设备读取库直接捕获输入,无需依赖前端页面:
- 安装依赖包
npm install node-hid
- 服务端监听代码示例
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
相关产品推荐
相关产品推荐

