Как получить логи сообщений в нужном мне порядке? - PullRequest
0 голосов
/ 25 сентября 2018

Как я могу предотвратить регистрацию Service running ... msg в первую очередь?Я хотел бы сообщения внутри testDBConnection фн.чтобы войти первым вместо.Когда БД не работает, я бы хотел, чтобы сообщение Looks like DB is not running продолжало регистрироваться, и после того, как БД начнет работать с сообщениями DB connection has been established и Service running ..., должны следовать.Я пробовал несколько вещей, но я не смог придумать правильный код.Спасибо за вашу помощь.

index.js

import app from './config/express';
import config from './config/config';
import logger from './config/winston';
import { initDbConnection } from './server/db';

app.listen(config.port, () => {
  initDbConnection();
  logger.info(`Service running and listening on port ${config.port}`);
});

db.js

import knex from 'knex';
import config from '../config/config';
import logger from '../config/winston';

const { db } = config;
let pool;

const testDBConnection = (client) => {
  const intervalId = setInterval(async () => {
    try {
      await client.select(1);
      logger.info('DB connection has been established');
      clearInterval(intervalId);
    } catch (error) {
      logger.error('Looks like DB is not running');
    }
  }, 2000);
};

export const initDbConnection = (mock) => {
  if (mock) {
    pool = knex({});
  } else {
    pool = knex({
      client: 'pg',
      version: '7.4.2',
      connection: db,
      debug: true
    });
    testDBConnection(pool);
  }
};

export const getDb = () => pool;

1 Ответ

0 голосов
/ 25 сентября 2018

Для этого вы можете использовать async / await.

import app from './config/express';
import config from './config/config';
import logger from './config/winston';
import { initDbConnection } from './server/db';

app.listen(config.port, async () => {
  await initDbConnection();
  logger.info(`Service running and listening on port ${config.port}`);
});

db.js:

import knex from 'knex';
import config from '../config/config';
import logger from '../config/winston';

const { db } = config;
let pool, connected;

const testDBConnection = (client) => {
   return new Promise(resolve => {
   const intervalId = setInterval(async () => {
        try {
          await client.select(1);
          if (connected) {
              return;
          }
          connected = true;

          logger.info('DB connection has been established');
          clearInterval(intervalId);
          resolve('success');
        } catch (error) {
          logger.error('Looks like DB is not running');
        }
      }, 2000);
   });
};

export const initDbConnection = (mock) => {
  if (mock) {
    pool = knex({});
  } else {
    pool = knex({
      client: 'pg',
      version: '7.4.2',
      connection: db,
      debug: true
    });
    return testDBConnection(pool);
  }
};

export const getDb = () => pool;

Таким образом, регистратор внутри app.listen cb не будет вызыватьсяпока initDbConnection не будет решен.Другой способ - просто использовать обещание then.

...