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

Node.js:使用Sequelize和Telegraf时如何避免'import语句不能在模块外使用'错误

解决Node.js中ES模块与CommonJS模块混用的报错问题

Node.js中ES模块(import/export)和CommonJS模块(require/module.exports)是两种独立的模块系统,默认无法在同一文件中混用,你遇到的报错正是因为这个原因。以下是两种彻底解决的方案:

方案一:统一使用ES模块(推荐)

  1. 保持package.json中已添加的"type": "module"配置
  2. 将所有require语句替换为ES模块的import语法
  3. 修改后的完整代码:
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"
});
  1. 直接运行node index.js即可

方案二:统一使用CommonJS模块

  1. 删除package.json中的"type": "module"配置(Node.js默认使用CommonJS)
  2. 将所有import语句替换为CommonJS的require语法
  3. 修改后的完整代码:
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"
});
  1. 直接运行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:02:27