NestJS集成AdminJS后访问/admin路由出现404错误
NestJS集成AdminJS后访问/admin路由出现404错误
兄弟,我之前也碰到过这个糟心的问题!咱们一步步来排查解决,肯定能搞定:
先查全局路由前缀是否搞鬼
如果你在main.ts里设置了全局路由前缀(比如app.setGlobalPrefix('api')),那AdminJS的/admin会自动变成/api/admin,这时候直接访问localhost:3000/admin自然会404。
解决办法也简单:在配置AdminModule的时候加个excludePrefix: true,让它不受全局前缀影响:AdminModule.createAdminAsync({ useFactory: () => ({ adminJsOptions: { rootPath: '/admin', resources: [/* 你的实体类 */], }, nestjsOptions: { excludePrefix: true, // 关键就是这行! }, }), }),再确认AdminJS的配置是否完整
检查你的AppModule里,有没有正确注册AdminJS的适配器(比如用TypeORM的话,必须注册Database和Resource),还有rootPath是不是明确设成了/admin:import * as AdminJS from 'adminjs'; import { Database, Resource } from '@adminjs/typeorm'; // 这行千万别漏!不然AdminJS识别不了你的数据库实体 AdminJS.registerAdapter({ Database, Resource }); @Module({ imports: [ AdminModule.createAdminAsync({ useFactory: () => ({ adminJsOptions: { rootPath: '/admin', // 明确指定路由根路径 resources: [/* 比如你的User、Post这些实体 */], }, }), }), ], }) export class AppModule {}排查中间件和守卫的冲突
如果你全局注册了守卫、拦截器或者其他中间件,说不定它们把/admin路径给拦截了。比如全局JWT守卫可能会把未登录的请求直接返回404(有些情况下会误返回404而不是401)。
这时候要在守卫里把/admin路径排除掉:@Injectable() export class AuthGuard implements CanActivate { canActivate(context: ExecutionContext): boolean { const request = context.switchToHttp().getRequest(); // 让/admin路径跳过权限校验 if (request.path.startsWith('/admin')) { return true; } // 你的其他权限校验逻辑 return ...; } }最后检查版本兼容性
有时候AdminJS和@adminjs/nestjs的版本和NestJS不匹配也会出问题。比如NestJS 10.x需要搭配@adminjs/nestjs 5.x以上的版本。你可以升级到最新版试试:npm install @adminjs/nestjs@latest adminjs@latest
先从全局前缀这个最常见的情况查起,大概率能解决!
备注:内容来源于stack exchange,提问作者Yann
相关产品推荐
相关产品推荐

