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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:24:06