Improve error reporting on CLI bootstrap command (#6977)

* Show full DB error on bootstrap connection issue

* Show full DB error on bootstrap
This commit is contained in:
Rijk van Zanten
2021-07-26 19:10:10 +02:00
committed by GitHub
parent 27037f95c7
commit 87ab9b3dfa
2 changed files with 14 additions and 25 deletions

View File

@@ -5,19 +5,16 @@ import env from '../../../env';
import logger from '../../../logger';
import { getSchema } from '../../../utils/get-schema';
import { RolesService, UsersService, SettingsService } from '../../../services';
import getDatabase, { isInstalled, hasDatabaseConnection } from '../../../database';
import getDatabase, { isInstalled, hasDatabaseConnection, validateDBConnection } from '../../../database';
import { SchemaOverview } from '../../../types';
export default async function bootstrap({ skipAdminInit }: { skipAdminInit?: boolean }): Promise<void> {
logger.info('Initializing bootstrap...');
if ((await isDatabaseAvailable()) === false) {
logger.error(`Can't connect to the database`);
process.exit(1);
}
const database = getDatabase();
await validateDBConnection(database);
if ((await isInstalled()) === false) {
logger.info('Installing Directus system tables...');
@@ -48,21 +45,6 @@ export default async function bootstrap({ skipAdminInit }: { skipAdminInit?: boo
process.exit(0);
}
async function isDatabaseAvailable() {
const tries = 5;
const secondsBetweenTries = 5;
for (let i = 0; i < tries; i++) {
if (await hasDatabaseConnection()) {
return true;
}
await new Promise((resolve) => setTimeout(resolve, secondsBetweenTries * 1000));
}
return false;
}
async function createDefaultAdmin(schema: SchemaOverview) {
logger.info('Setting up first admin role...');
const rolesService = new RolesService({ schema });

View File

@@ -94,8 +94,8 @@ export function getSchemaInspector(): ReturnType<typeof SchemaInspector> {
return inspector;
}
export async function hasDatabaseConnection(): Promise<boolean> {
const database = getDatabase();
export async function hasDatabaseConnection(database?: Knex): Promise<boolean> {
database = database ?? getDatabase();
try {
if (env.DB_CLIENT === 'oracledb') {
@@ -103,15 +103,22 @@ export async function hasDatabaseConnection(): Promise<boolean> {
} else {
await database.raw('SELECT 1');
}
return true;
} catch {
return false;
}
}
export async function validateDBConnection(): Promise<void> {
export async function validateDBConnection(database?: Knex): Promise<void> {
database = database ?? getDatabase();
try {
await hasDatabaseConnection();
if (env.DB_CLIENT === 'oracledb') {
await database.raw('select 1 from DUAL');
} else {
await database.raw('SELECT 1');
}
} catch (error) {
logger.error(`Can't connect to the database.`);
logger.error(error);