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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:15:20