Node.js:使用Sequelize和Telegraf时如何避免'import语句不能在模块外使用'错误
解决Node.js中ES模块与CommonJS模块混用的报错问题
Node.js中ES模块(import/export)和CommonJS模块(require/module.exports)是两种独立的模块系统,默认无法在同一文件中混用,你遇到的报错正是因为这个原因。以下是两种彻底解决的方案:
方案一:统一使用ES模块(推荐)
- 保持
package.json中已添加的"type": "module"配置 - 将所有
require语句替换为ES模块的import语法 - 修改后的完整代码:
import Sequelize from 'sequelize'; import { Telegraf } from 'telegraf'; const bot = new Telegraf("Token"); const sequelize = new Sequelize("bot", "admin", { dialect: "sqlite", storage: "disk:/path/to/database" });
- 直接运行
node index.js即可
方案二:统一使用CommonJS模块
- 删除
package.json中的"type": "module"配置(Node.js默认使用CommonJS) - 将所有
import语句替换为CommonJS的require语法 - 修改后的完整代码:
const Sequelize = require('sequelize'); const { Telegraf } = require('telegraf'); const bot = new Telegraf("Token"); const sequelize = new Sequelize("bot", "admin", { dialect: "sqlite", storage: "disk:/path/to/database" });
- 直接运行
node index.js即可
关于你之前尝试无效的原因
- 修改后缀为
.cjs:该后缀表示文件为CommonJS模块,此时不能使用import语法,若拆分的文件仍有import,会继续报错 - 修改后缀为
.mjs:该后缀表示文件为ES模块,此时不能使用require语法,若拆分的文件仍有require,会继续报错 - 拆分逻辑:拆分后需确保所有文件遵循同一模块规范,比如主文件用ES模块,拆分的数据库文件也必须用
import而非require,反之亦然
不推荐的临时混用方式(仅作了解)
如果因特殊需求必须混用,可在ES模块中通过createRequire引入CommonJS模块,但长期维护不建议这么做:
import { createRequire } from 'module'; const require = createRequire(import.meta.url); const Sequelize = require('sequelize'); import { Telegraf } from 'telegraf'; const bot = new Telegraf("Token"); const sequelize = new Sequelize("bot", "admin", { dialect: "sqlite", storage: "disk:/path/to/database" });
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

