使用AdminJS对接PostgreSQL显示表数据报错:缺少Database和Resource
问题分析与解决方案
报错Error: Adapter has to have both Database and Resource的核心原因是@adminjs/sql适配器要求必须同时配置并关联Database和Resource类,以下是具体修复步骤:
1. 确保完整导入依赖
从@adminjs/sql中同时导入Database和Resource:
// CommonJS const { Database, Resource } = require('@adminjs/sql'); // ES模块 import { Database, Resource } from '@adminjs/sql';
2. 关联Database与Resource
初始化PostgreSQL连接池后,创建Database实例并将Resource绑定到该实例:
const { Pool } = require('pg'); // 配置PostgreSQL连接 const pool = new Pool({ user: '你的数据库用户', host: 'localhost', database: '你的数据库名', password: '你的数据库密码', port: 5432, }); // 创建Database实例并绑定Resource const db = new Database({ pool, dialect: 'postgresql' }); Resource.setDatabase(db);
3. 正确注册数据库表资源
在AdminJS配置中,通过Resource.from()方法注册要展示的表:
const adminOptions = { resources: [ // 注册单个表,可添加自定义配置 { resource: Resource.from('users'), options: { properties: { createdAt: { isVisible: { list: true, edit: false } } } } }, // 直接注册表(无额外配置) Resource.from('posts') ], // 保留你的认证配置(已正常工作) auth: { authenticate: async (email, password) => { // 你的认证逻辑 if (email === 'admin@example.com' && password === 'admin123') { return { email }; } return null; }, cookieName: 'adminjs-session', cookiePassword: 'your-strong-secret-here' } };
完整可运行示例片段
const express = require('express'); const AdminJS = require('adminjs'); const { Database, Resource } = require('@adminjs/sql'); const { buildAuthenticatedRouter } = require('@adminjs/express'); const { Pool } = require('pg'); const app = express(); // 初始化PostgreSQL连接池 const pool = new Pool({ connectionString: process.env.DATABASE_URL || 'postgresql://user:password@localhost:5432/your_db' }); // 绑定Database与Resource const db = new Database({ pool, dialect: 'postgresql' }); Resource.setDatabase(db); // AdminJS核心配置 const admin = new AdminJS({ resources: [ Resource.from('users'), Resource.from('products') ], auth: { authenticate: async (email, password) => { // 替换为你的实际认证逻辑 if (email === 'admin@example.com' && password === 'secure-password') { return { email }; } return null; }, cookieName: 'adminjs', cookiePassword: 'super-secret-cookie-password' }, rootPath: '/admin' }); // 构建带认证的路由 const router = buildAuthenticatedRouter(admin); app.use(admin.options.rootPath, router); // 启动服务 app.listen(3000, () => { console.log('AdminJS running at http://localhost:3000/admin'); });
额外排查要点
- 确认@adminjs/sql与AdminJS核心版本兼容(建议使用相同大版本,比如均为6.x)
- 测试PostgreSQL连接是否正常:执行
pool.query('SELECT 1')验证连接 - 检查要展示的表名是否与数据库中完全一致(注意大小写,PostgreSQL默认区分大小写)
内容的提问来源于stack exchange,提问作者Md. Sabik Alam Rahat
相关产品推荐
相关产品推荐

