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

discord.js机器人使用import加载命令文件报Unexpected identifier错误如何解决

问题原因
  • 你使用的import command from '路径'属于ES模块的静态导入语法,有两个不可违反的使用规则:
    • 只能写在JS文件的顶层作用域,不能嵌套在函数、循环、条件判断等块级作用域内
    • from后只能跟字符串字面量,不支持变量、表达式拼接的动态路径
      你将该语法写在for循环内且使用了拼接的动态路径,直接触发语法错误。
修复方案(无额外依赖)

方案1:保留CommonJS规范(推荐)

如果你的项目package.json中没有配置"type": "module",说明当前是CommonJS项目,直接换回原有的require写法即可,本身就适配你现有命令文件的module.exports导出规则,不需要额外修改:

// 把import行替换成原来的require即可,建议用path.join拼接路径避免系统兼容问题
let command = require(path.join(commandsDir, files[i]));

方案2:适配ES模块规范

如果你的项目已经配置了"type": "module"无法使用require,则使用ES标准内置的动态import()函数处理,注意该函数是异步的,需要调整代码的异步逻辑:

  1. 先处理路径依赖(ES模块默认无__dirname,需手动生成):
import { fileURLToPath } from 'url';
import path from 'path';
import fs from 'fs';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// 替换为你自己的commands目录相对路径
const commandsDir = path.join(__dirname, 'commands/');
  1. 修改getCommands为异步函数,使用动态导入:
getCommands = async function () {
  let files = fs.readdirSync(commandsDir).filter(file => (
    !fs.statSync(path.join(commandsDir, file)).isDirectory() &&
    !file.startsWith("!") &&
    file.endsWith(".js")));
  let commands = {};

  for (let i = 0; i < files.length; i++) {
    try {
      const module = await import(path.join(commandsDir, files[i]));
      // CommonJS导出的内容会自动挂载到导入模块的default属性上
      const command = module.default;
      commands[command.name] = command;
    } catch (e) {
      console.error(`加载命令${files[i]}失败:`, e);
    }
  }
  return commands;
}
  1. 调用getCommands的地方需要适配异步逻辑:
// 原来的同步调用改为异步await调用
const commands = await getCommands();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:42:03