Express项目集成AdminJS报错:Cannot use import statement outside a module
解决AdminJS在CommonJS项目中的导入报错问题
问题描述
在基于Express.js和PostgreSQL的frogbase项目中添加AdminJS时,按照官方文档使用import语句引入@adminjs/express,运行app.js时出现以下报错:
SyntaxError: Cannot use import statement outside a module
完整报错栈:import AdminJSExpress from '@adminjs/express' ^^^^^^ SyntaxError: Cannot use import statement outside a module at internalCompileFunction (node:internal/vm:77:18) at wrapSafe (node:internal/modules/cjs/loader:1287:20) at Module._compile (node:internal/modules/cjs/loader:1339:27) at Module._extensions..js (node:internal/modules/cjs/loader:1434:10) at Module.load (node:internal/modules/cjs/loader:1206:32) at Module._load (node:internal/modules/cjs/loader:1022:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:142:12) at node:internal/main/run_main_module:28:49 Node.js v21.5.0
不想将项目改为ES模块(即不添加"type": "module"到package.json),也不想使用TypeScript,需要找到适配方案。
解决方案
项目默认是CommonJS模块规范,直接改用require()语法替代ES模块的import即可,具体调整如下:
1. 替换AdminJS相关包的导入方式
将原来的ES模块导入代码:
import AdminJS from 'adminjs' import AdminJSExpress from '@adminjs/express'
替换为CommonJS的require写法:
const AdminJS = require('adminjs') const AdminJSExpress = require('@adminjs/express').default
注意:
@adminjs/express的CommonJS导出需要追加.default,因为该包的ES模块默认导出在CommonJS环境下会被封装在default属性中。
2. 其他AdminJS适配器的导入调整
如果使用了适配PostgreSQL的AdminJS插件(比如@adminjs/sequelize或@adminjs/pg),同样改用require并按需添加.default:
// 示例:导入Sequelize适配器 const AdminJSSequelize = require('@adminjs/sequelize').default
3. 保持后续代码的CommonJS语法一致性
确保AdminJS实例创建、路由挂载的代码符合CommonJS规范,示例如下:
const express = require('express') const app = express() // 初始化AdminJS实例 const adminJs = new AdminJS({ databases: [/* 你的PostgreSQL数据库实例 */], rootPath: '/admin' }) // 构建AdminJS的Express路由 const router = AdminJSExpress.buildRouter(adminJs) // 挂载AdminJS路由 app.use(adminJs.options.rootPath, router) app.listen(3000, () => { console.log('Server running on port 3000') })
4. 确认依赖安装正确性
确保已安装所有必要依赖:
npm install adminjs @adminjs/express # 若使用Sequelize连接PostgreSQL,需额外安装适配器 npm install @adminjs/sequelize
关键说明
AdminJS官方文档默认展示ES模块语法,但它完全支持CommonJS环境,仅需调整导入方式即可,无需修改项目的模块系统类型,也不需要引入TypeScript。
内容的提问来源于stack exchange,提问作者Md. Sabik Alam Rahat
相关产品推荐
相关产品推荐

