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

无HTML环境下引用外部JS方法?Discord Bot模块导入报错求助

解决Node.js环境下Discord Bot拆分JS文件的模块引用问题

你遇到的SyntaxError: Cannot use import statement outside a module报错,核心原因是Node.js默认采用CommonJS模块系统,而你混用了CommonJS的require和ES模块的import/export语法——两种模块系统不能在同一个项目里混用。下面给你两种可行的解决思路:

方案一:改用CommonJS语法(无需配置,快速适配)

CommonJS是Node.js传统的模块机制,和你熟悉的C#命名空间逻辑更接近:

  • 把要暴露的方法/变量通过module.exports导出(类似C#中类的public成员)
  • 通过require导入其他模块的内容(类似C#中using命名空间后引用类)

修改代码:

  1. test.js:替换导出语法
function sendMessage(message) {
    if (message.content === 'say ping') {
        message.channel.send('!ping');
    }
}

module.exports = { sendMessage };
  1. app.js:替换导入语法
const { Client, IntentsBitField } = require('discord.js');
const token = "token_here";
const { sendMessage } = require('./test.js'); // 改用require导入

const client = new Client({
    intents: [
        IntentsBitField.Flags.Guilds,
        IntentsBitField.Flags.GuildMembers,
        IntentsBitField.Flags.GuildMessages,
        IntentsBitField.Flags.MessageContent
    ]
});

client.on('ready', (clientTemp) => {
    console.log(`${clientTemp.user.tag} is online`);
});

client.on('messageCreate', (message) => {
    sendMessage(message);
})

client.login(token);

方案二:配置为ES模块系统(使用import/export)

如果更习惯ES模块的语法,需要告诉Node.js当前项目使用ES模块:

  1. 在项目根目录的package.json中添加"type": "module"字段(如果没有package.json,先执行npm init -y生成)
{
  "type": "module",
  // 其他原有字段...
}
  1. 统一所有文件的模块语法:
    • app.js:把require改成import
    import { Client, IntentsBitField } from 'discord.js';
    const token = "token_here";
    import { sendMessage } from './test.js';
    
    const client = new Client({
        intents: [
            IntentsBitField.Flags.Guilds,
            IntentsBitField.Flags.GuildMembers,
            IntentsBitField.Flags.GuildMessages,
            IntentsBitField.Flags.MessageContent
        ]
    });
    
    client.on('ready', (clientTemp) => {
        console.log(`${clientTemp.user.tag} is online`);
    });
    
    client.on('messageCreate', (message) => {
        sendMessage(message);
    })
    
    client.login(token);
    
    • test.js:保持原有export语法即可
    export function sendMessage(message) {
        if (message.content === 'say ping') {
            message.channel.send('!ping');
        }
    }
    

补充:和C#命名空间的类比

  • CommonJS的module.exports/require:相当于C#中在类里定义public方法,然后通过using 命名空间后实例化类调用方法(或静态类直接调用)
  • ES模块的export/import:类似C#中public static方法,通过using static 命名空间.类直接引用方法,或者导入整个模块

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:31:09