Ascii Tables输出异常且命令处理器无法加载命令问题求助
问题根因与解决方案
核心问题排查点
- 异步逻辑错误:代码中使用
Array.map包裹async函数时,没有等待所有异步任务执行完成就打印表格,此时所有addRow操作还未执行,输出的自然是空的表格框架。同时glob匹配如果未正确拿到命令文件,也会导致命令加载失败。 - Ascii Table未正确初始化:未提前设置表头就直接添加行,会直接导致表格渲染失效。
- 路径硬编码错误:写死
file.split("/")[7]的索引可靠性极低,不同操作系统的路径分隔符、项目目录深度不一致都会导致取值为空,进一步导致行数据异常。 - 多余的异步等待:
Table.addRow是同步方法,不需要添加await标识,多余的异步标识会打乱执行时序。
修正步骤
1. 确认Ascii Table初始化正确
提前设置表头和表格标题,示例代码:
const AsciiTable = require('ascii-table') // 初始化表格 const Table = new AsciiTable('命令加载日志') // 必须设置表头,参数与后续addRow的字段对应 Table.setHeading('命令名称', '加载状态', '备注信息')
2. 修正异步执行逻辑
使用Promise.all包裹map返回的所有promise,确保所有命令加载、行添加操作完成后再打印表格:
const path = require('path') const PG = require('fast-glob') // 等待所有命令加载完成 await Promise.all( (await PG(`${process.cwd()}/Commands/*/*.js`)).map(async (file) => { const command = require(file); if(!command.name) { // 用path模块获取文件名,避免硬编码分割索引 const fileName = path.basename(file) Table.addRow(fileName, "FAILED", "缺少name属性") return } if(!command.description) { Table.addRow(command.name, "FAILED", "缺少description属性") return } if(command.permission) { if(Perms.includes(command.permission)) { command.defaultPermission = false; } else { Table.addRow(command.name, "FAILED", "权限值无效") return } } client.commands.set(command.name, command); CommandsArray.push(command); // addRow为同步方法,无需await Table.addRow(command.name, "SUCCESSFUL", "加载完成"); }) ) // 所有操作完成后打印表格 console.log(Table.toString())
3. 额外排查项
- 打印
await PG(${process.cwd()}/Commands//.js)的返回结果,确认glob匹配到了命令文件,如果返回空数组,检查路径拼写是否正确,命令文件的存放位置是否匹配通配符规则。 - 确认
Perms数组已提前定义,包含所有用到的权限枚举值,避免权限校验逻辑异常提前返回。 - Windows系统下路径分隔符为
\,使用path模块处理路径可自动兼容不同操作系统,避免路径分割失效的问题。
内容的提问来源于stack exchange,提问作者santoby13
相关产品推荐
相关产品推荐

