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

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包版本冲突。
    1. 卸载现有依赖:
      npm uninstall escpos escpos-usb
      
    2. 安装指定兼容版本:
      npm install escpos@3.0.0-alpha.4 escpos-usb@3.0.0-alpha.4
      
    3. 修改代码适配新版本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
      

二、替代实现方式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 23:05:57