AdminJS与Fastify、Mongoose集成时遭遇NoResourceAdapterError问题
解决AdminJS + Fastify + Mongoose构建后NoResourceAdapterError问题
在Node.js中集成AdminJS、Fastify和Mongoose时,开发环境(yarn dev)运行正常,但通过esbuild构建后执行bundle/out.mjs会抛出以下错误:
throw new NoResourceAdapterError(resourceObject); ^ NoResourceAdapterError: There are no adapters supporting one of the resource you provided
问题根源
- 开发环境与构建后环境的模块加载/注册顺序存在差异
- AdminJS实例未正确关联Mongoose资源
- esbuild外部依赖配置可能导致Adapter未被正确打包或加载
解决方案
1. 正确将资源传递给AdminJS实例
原代码中resources定义在单独变量中但未关联到AdminJS实例,导致AdminJS无法识别资源类型。修改app.ts:
// 调整顺序:先注册Adapter,再导入资源 import AdminJS from 'adminjs' import * as AdminJSMongoose from '@adminjs/mongoose' // 提前注册Mongoose Adapter AdminJS.registerAdapter({ Resource: AdminJSMongoose.Resource, Database: AdminJSMongoose.Database, }) import AdminJSFastify from '@adminjs/fastify' import Fastify from 'fastify' import mongoose from 'mongoose' import { Category } from './model/category.entity' const PORT = 3000 const start = async () => { await mongoose.connect(`MONGO_URI`) const app = Fastify() // 直接在AdminJS构造函数中传入resources const admin = new AdminJS({ databases: [], rootPath: '/admin', resources: [Category] // 关键:将资源添加到AdminJS实例配置 }) await AdminJSFastify.buildRouter(admin, app) app.listen({ port: PORT }, (err, addr) => { if (err) { console.error(err) } else { console.log(`AdminJS started on http://localhost:${PORT}${admin.options.rootPath}`) } }) } start()
2. 调整esbuild外部依赖配置
将@adminjs/mongoose从external列表中移除,确保esbuild将其打包进产物,避免运行时模块解析问题:
修改esbuild.mjs的external数组:
external: [ "fsevents", "nock", "aws-sdk", "mock-aws-s3", "adminjs", "@adminjs/fastify", "bcrypt", "crypto" // 移除 "@adminjs/mongoose" ],
3. 验证模块加载顺序
确保Adapter注册在所有Mongoose模型导入之前——ES模块静态导入严格按顺序执行,提前注册Adapter能保证AdminJS识别后续加载的Mongoose模型。
验证步骤
- 重新执行esbuild构建
- 运行
node bundle/out.mjs - 访问
http://localhost:3000/admin确认正常加载
内容的提问来源于stack exchange,提问作者Kundan Prasad
相关产品推荐
相关产品推荐

