Node.js serialport模块报错:TypeError: SerialPort.list is not a function
解决SerialPort.list is not a function错误
这个错误的核心原因是serialport模块版本差异,v10及以上版本对list方法的导出和调用逻辑做了大幅调整,不再是SerialPort类的静态方法。以下是具体的解决方法:
1. 先确认你的serialport版本
执行命令查看当前安装的版本:
npm list serialport
2. 针对v10+版本的正确写法
新版本中list是独立导出的异步函数,返回Promise,同时端口对象的标识字段从comName改为了path:
CommonJS写法
const { list } = require('serialport'); async function getPortsList() { try { const ports = await list(); // 提取端口路径 return ports.map(port => port.path); } catch (err) { throw err; } } // 调用示例 getPortsList() .then(portsList => console.log('已连接串口:', portsList)) .catch(err => console.error('获取串口列表失败:', err));
ES模块写法(如果你的项目用ESModule)
import { list } from 'serialport'; async function getPortsList() { try { const ports = await list(); return ports.map(port => port.path); } catch (err) { throw err; } }
3. 如果你需要用回调风格(适配旧习惯或特定场景)
可以用Node.js内置的util.promisify把Promise转换为回调形式:
const { list } = require('serialport'); const { promisify } = require('util'); const listPorts = promisify(list); function getPortsList(callback) { listPorts() .then(ports => callback(null, ports.map(port => port.path))) .catch(err => callback(err)); } // 调用示例 getPortsList((err, portsList) => { if (err) { console.error('出错了:', err); return; } console.log('串口列表:', portsList); });
4. 如果是v9及以下旧版本的问题
旧版本中list确实是SerialPort的静态方法,但要确保你正确导入了SerialPort类:
const SerialPort = require('serialport'); function getPortsList(callback) { SerialPort.list((err, ports) => { if (err) return callback(err); const portsList = ports.map(port => port.comName); callback(null, portsList); }); }
如果还是报错,建议卸载重装对应版本:
npm uninstall serialport npm install serialport@9.x
内容的提问来源于stack exchange,提问作者Ninto 1
相关产品推荐
相关产品推荐

