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

基于React的自助终端使用Xprinter XP-58 USB打印机打印小票遇阻求助

解决React自助终端USB连接Xprinter XP-58打印问题的方案

一、先解决receiptio当前的核心错误

你测试代码里的参数完全错配了——打印机是USB连接,但你用-d 192.168.123.100指定了网络IP,这是导致输出disconnect的直接原因。按以下步骤修正:

1. 获取打印机的USB设备标识

  • Windows:打开「设备管理器」→ 找到「打印机」→ 右键Xprinter XP-58 → 属性 → 查看设备名称(比如Xprinter XP-58 Series)
  • Linux:执行lsusb找到打印机的USB路径,通常是/dev/usb/lp0;若找不到,试试lpinfo -v
  • Mac:执行system_profiler SPUSBDataType,找到打印机对应的设备路径(比如/dev/usblp0)

2. 修改receiptio测试代码

替换参数中的IP为USB设备标识,同时将驱动从generic改为escpos(Xprinter XP-58兼容ESC/POS指令集):

const receiptio = require("receiptio");

const receiptmd = `^^^RECEIPT

12/18/2021, 11:22:33 AM
Asparagus | 1| 1.00
Broccoli  | 2| 2.00
Carrot    | 3| 3.00
---
^TOTAL | ^6.00`;

// 示例:Windows用打印机名称,Linux/Mac用USB路径
receiptio
  .print(receiptmd, '-d "Xprinter XP-58 Series" -p escpos -c 42')
  .then((result) => {
    console.log(result);
  })
  .catch(err => console.error("打印错误:", err)); // 新增catch捕获详细错误

二、改用更稳定的node-thermal-printer方案

你之前安装失败大概率是缺少系统依赖,按以下步骤修复:

1. 安装系统依赖

  • Windows:下载安装libusb,并添加到系统环境变量
  • Linux:执行sudo apt-get install libusb-dev libcups2-dev
  • Mac:执行brew install libusb

2. 重新安装模块

npm install node-thermal-printer --save --unsafe-perm

3. USB打印测试代码

const { ThermalPrinter, PrinterTypes, CharacterSet } = require("node-thermal-printer");

// 初始化打印机,替换devicePath为你的USB路径
const printer = new ThermalPrinter({
  type: PrinterTypes.EPSON, // XP-58兼容EPSON指令集
  interface: "usb",
  characterSet: CharacterSet.CHINESE_SIMPLIFIED, // 支持中文打印
  devicePath: "/dev/usb/lp0", // Linux示例;Windows可直接用打印机名称
});

async function printReceipt() {
  try {
    await printer.isPrinterConnected(); // 先检查连接状态
    // 构建小票内容
    printer.alignCenter();
    printer.println("自助终端订单");
    printer.alignLeft();
    printer.println("12/18/2021, 11:22:33 AM");
    printer.println("------------------------");
    printer.println("Asparagus | 1 | $1.00");
    printer.println("Broccoli  | 2 | $2.00");
    printer.println("Carrot    | 3 | $3.00");
    printer.println("------------------------");
    printer.bold(true);
    printer.println(`总计: $6.00`);
    printer.bold(false);
    printer.cut(); // 切纸
    
    await printer.execute();
    console.log("打印成功");
  } catch (error) {
    console.error("打印失败:", error);
  }
}

printReceipt();

三、搭建Node.js服务器对接React端

用Express快速实现打印接口,接收React端的订单数据:

1. 服务器代码

const express = require('express');
const bodyParser = require('body-parser');
const { ThermalPrinter, PrinterTypes, CharacterSet } = require("node-thermal-printer");

const app = express();
app.use(bodyParser.json());

// 初始化打印机
const printer = new ThermalPrinter({
  type: PrinterTypes.EPSON,
  interface: "usb",
  characterSet: CharacterSet.CHINESE_SIMPLIFIED,
  devicePath: "/dev/usb/lp0", // 替换为你的设备路径
});

// 打印接口
app.post('/print-receipt', async (req, res) => {
  const { orderItems, total, timestamp } = req.body;
  try {
    await printer.isPrinterConnected();
    // 构建小票
    printer.alignCenter();
    printer.println("自助终端订单");
    printer.alignLeft();
    printer.println(timestamp);
    printer.println("------------------------");
    orderItems.forEach(item => {
      printer.println(`${item.name} | ${item.quantity} | $${item.price.toFixed(2)}`);
    });
    printer.println("------------------------");
    printer.bold(true);
    printer.println(`总计: $${total.toFixed(2)}`);
    printer.bold(false);
    printer.cut();
    await printer.execute();
    
    res.status(200).json({ success: true, message: "打印成功" });
  } catch (error) {
    console.error(error);
    res.status(500).json({ success: false, message: "打印失败", error: error.message });
  }
});

const PORT = 3001;
app.listen(PORT, () => {
  console.log(`打印服务器运行在 http://localhost:${PORT}`);
});

2. React端调用示例

用axios发送订单数据:

import axios from 'axios';

const printReceipt = async (orderData) => {
  try {
    await axios.post('http://localhost:3001/print-receipt', orderData);
    alert("订单已打印");
  } catch (err) {
    alert("打印失败,请重试");
  }
};

// 订单确认时调用
printReceipt({
  timestamp: new Date().toLocaleString(),
  orderItems: [
    { name: "Asparagus", quantity: 1, price: 1.00 },
    { name: "Broccoli", quantity: 2, price: 2.00 },
    { name: "Carrot", quantity: 3, price: 3.00 }
  ],
  total: 6.00
});

四、额外注意事项

  • Linux权限问题:普通用户可能没有USB设备访问权限,执行sudo usermod -aG lp $USER,然后重启系统
  • Windows驱动:确保已安装Xprinter官方驱动,打印机设置为默认打印机
  • 中文打印:必须指定对应字符集(如CHINESE_SIMPLIFIED),否则会出现乱码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:29:54