Javascript 如何按需要的顺序获取日志消息?

Javascript 如何按需要的顺序获取日志消息?,javascript,express,knex.js,Javascript,Express,Knex.js,如何防止服务运行…msg首先被记录?我想要testDBConnectionfn中的消息。改为先记录。当数据库未运行时,我希望看起来好像数据库未运行msg被记录下来,一旦数据库启动,建立了DB连接和服务运行…msgs应该跟进。我尝试了多种方法,但都没有找到合适的代码。谢谢你的帮助 index.js import app from './config/express'; import config from './config/config'; import logger from './confi

如何防止
服务运行…
msg首先被记录?我想要
testDBConnection
fn中的消息。改为先记录。当数据库未运行时,我希望
看起来好像数据库未运行
msg被记录下来,一旦数据库启动,建立了
DB连接
服务运行…
msgs应该跟进。我尝试了多种方法,但都没有找到合适的代码。谢谢你的帮助

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


您可以使用async/wait来实现这一点

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;

这样,在解析initDbConnection之前,不会调用app.listen cb中的记录器。另一种方法是只使用promise
然后

好的,我们快到了。如果DB在服务启动之前正在运行,那么它可以正常工作。然而当DB最初关闭,然后服务启动时,这是我在控制台中看到的:
错误:看起来DB没有运行
错误:看起来DB没有运行
错误:看起来DB没有运行
信息:DB连接已经建立
信息:服务正在端口上运行并侦听8080
信息:数据库连接已建立
信息:数据库连接已建立
如您所见,数据库连接已建立,消息已多次打印。发生此双重打印的最可能原因是,有两个
客户端。选择(1)数据库完成时正在运行的请求(例如,两个未完成的间隔)。查看我的编辑以查看可能的解决方案。请注意,我没有透露完整的或最佳实践解决方案-只是处理这一问题的主要技术。例如,您可能想多次调用
testDBConnection
,然后仍然有一个间隔在运行,因此在这种情况下,将记录器和
connected
if移动到底部。希望这有帮助。为什么有2个
客户端。选择(1)
查询正在运行?
setInterval
中的计划功能能否并行运行?如果你能详细说明一下,我会很感激的。我对承诺、异步/等待和setInterval的组合有点困惑。谢谢。旗标修复程序解决问题了吗?如果是这样,那么情况是这样的:一个称为
client.select(1)
。两秒钟过去了,调用了另一个
客户端。选择(1)
。同时,
client.select(1)
promise为这两个问题解决。下面是让它更清晰的流程:``1)设置间隔2)间隔1 3)间隔2 4)间隔1-由于DB超时而被拒绝5)间隔3 6)DB活动7)间隔2和3已成功解决(启动记录器)``希望这更清晰。
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;