如何在Discord机器人脚本中正确配置node-json-db并解决import语句报错问题
解决Node.js中
SyntaxError: Cannot use import statement outside a module问题 你遇到的这个错误核心原因是:你的命令文件使用了CommonJS模块规范(用module.exports导出),但同时又混用了ES模块的import语句,Node.js默认不允许在CommonJS模块中直接使用import。结合你的Discord机器人场景,给你两种最实用的解决方案:
方案1:改用CommonJS的require(最快捷,无需调整项目结构)
因为你的main.js是用CommonJS加载命令的,直接把import替换成CommonJS标准的require就能完美兼容:
module.exports = { name: 'search', description: "Searches for patient info from database", async execute(message, args, Discord){ // 替换import为require const { JsonDB } = require('node-json-db'); const { Config } = require('node-json-db/dist/lib/JsonDBConfig'); // 修正路径写法:去掉多余空格,正确拼接.json后缀 const cleanedQuery = message.content.replace('search', '').trim(); const dbPath = `pdb/${cleanedQuery}.json`; var db = new JsonDB(new Config(dbPath, true, false, '/')); // push是异步方法,建议用await确保写入完成 await db.push("/test1","super test"); } }
额外提示:原代码里的路径拼接有小问题,我加了trim()去掉search命令后的多余空格,避免生成带空格的无效路径,同时把.json后缀放在正确的拼接位置。
方案2:切换整个项目为ES模块(适合长期维护)
如果你想统一使用现代ES模块的import/export语法,需要做以下调整:
- 在项目根目录的
package.json中添加"type": "module"字段,告诉Node.js把所有.js文件当作ES模块处理。 - 修改命令文件的导出方式,把
module.exports换成export default:
export default { name: 'search', description: "Searches for patient info from database", async execute(message, args, Discord){ import { JsonDB } from 'node-json-db'; import { Config } from 'node-json-db/dist/lib/JsonDBConfig'; const cleanedQuery = message.content.replace('search', '').trim(); const dbPath = `pdb/${cleanedQuery}.json`; const db = new JsonDB(new Config(dbPath, true, false, '/')); await db.push("/test1","super test"); } }
- 同步修改你的
main.js,把所有require语句替换成import,确保整个项目的模块规范统一。
这种方式需要调整所有现有文件的语法,但长期来看更符合JavaScript的发展趋势。
内容的提问来源于stack exchange,提问作者MysteeriMikitin
相关产品推荐
相关产品推荐

