基于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
相关产品推荐
相关产品推荐

