Node.js用escpos/escpos-usb打印报错usb.on is not a function求解决
问题:Node.js使用escpos+escpos-usb打印Epson TM-T20III时报错
TypeError: usb.on is not a function 用户代码示例:
var escpos = require("escpos"); var USB = require("escpos-usb"); const device = new USB(); var printer = new escpos.Printer(device); const printReceipt = () => { device.open(() => { printer .font("a") .align("CT") .style("bu") .size(1, 1) .text("This is a test print") .cut() .close(); }); }; module.exports = { printReceipt: printReceipt, };
解决方案
一、修复escpos-usb的报错问题
- 版本兼容问题:escpos与escpos-usb版本不匹配是核心原因,尤其是依赖的
usb包版本冲突。- 卸载现有依赖:
npm uninstall escpos escpos-usb - 安装指定兼容版本:
npm install escpos@3.0.0-alpha.4 escpos-usb@3.0.0-alpha.4 - 修改代码适配新版本API:新版本需要指定打印机的VID和PID(Epson TM-T20III的默认VID为
04B8,PID为0E23,可通过设备管理器确认):const escpos = require('escpos'); const USB = require('escpos-usb'); // 初始化USB设备,传入打印机VID和PID const device = new USB(0x04B8, 0x0E23); const printer = new escpos.Printer(device); const printReceipt = () => { device.open((err) => { if (err) { console.error('设备打开失败:', err); return; } printer .font('a') .align('ct') .style('bu') .size(1, 1) .text('This is a test print') .cut() .close(); }); }; module.exports = { printReceipt };
- 卸载现有依赖:
- 权限问题:Linux/macOS下普通用户可能无USB设备访问权限:
- Linux:创建
/etc/udev/rules.d/99-epson-printer.rules文件,添加内容:
执行命令重新加载规则:SUBSYSTEM=="usb", ATTRS{idVendor}=="04b8", ATTRS{idProduct}=="0e23", MODE="0666"sudo udevadm control --reload-rules && sudo udevadm trigger
- Linux:创建
二、替代实现方式
1. 使用printer库(跨平台USB/本地打印)
该库封装了系统打印服务,无需手动处理USB底层细节,对Epson打印机兼容性更好:
- 安装依赖:
npm install printer - 示例代码:
const printer = require('printer'); const printReceipt = () => { // 获取打印机列表,匹配Epson TM-T20III const printers = printer.getPrinters(); const targetPrinter = printers.find(p => p.name.includes('TM-T20III')); if (!targetPrinter) { console.error('未找到目标打印机'); return; } // 构造ESC/POS指令流 const printContent = [ '\x1B\x40', // 初始化打印机 '\x1B\x61\x01', // 居中对齐 '\x1B\x21\x30', // 加粗+双倍高度 'This is a test print\n', '\x1B\x21\x00', // 取消格式 '\x1D\x56\x00' // 自动切纸 ].join(''); printer.printDirect({ data: printContent, printer: targetPrinter.name, type: 'RAW', success: () => console.log('打印完成'), error: (err) => console.error('打印失败:', err) }); }; module.exports = { printReceipt };
2. 网络打印(推荐,若打印机支持以太网/Wi-Fi)
Epson TM-T20III支持网络连接,直接通过TCP发送ESC/POS指令,无需USB驱动,稳定性更高:
- 示例代码:
const net = require('net'); const printReceipt = () => { // 替换为打印机的IP地址和端口(默认9100) const printerIP = '192.168.1.100'; const printerPort = 9100; const client = new net.Socket(); client.connect(printerPort, printerIP, () => { const printContent = [ '\x1B\x40', '\x1B\x61\x01', '\x1B\x21\x30', 'This is a test print\n', '\x1B\x21\x00', '\x1D\x56\x00' ].join(''); client.write(printContent); client.end(); }); client.on('error', (err) => { console.error('连接打印机失败:', err); }); }; module.exports = { printReceipt };
内容的提问来源于stack exchange,提问作者Joshua
相关产品推荐
相关产品推荐

