如何使用 setErrorHandler 结束 fastify 中特定错误的进程?

How to end process on specific error in fastify using setErrorHandler?

在我的应用程序中,我连接到一个数据库,然后对其进行初始化。我有两个自定义插件。第一个插件连接到数据库,然后它注册第二个插件,它初始化数据库(创建表、域等)

如果这两个插件内部发生错误,我想停止进程,因为没有数据库连接和初始化,应用程序将无法运行。

在app.ts我有

const fastify = Fastify({ logger: true });

fastify.register<ConnectAndInitDBConfig>(ConnectAndInitDB, {
  config,
  initSqlPath: 'assets/init.sql',
});

这是第一个插件ConnectAndInitDB

const ConnectAndInitDB: FastifyPluginCallback<ConnectAndInitDBConfig> = (
  fastify,
  { config, initSqlPath },
  done
) => {
  fastify.register(fastifyPostgres, config); // this connects to the DB (fastify-postgres NPM package)
  fastify.after(err => {
    if (err) {
      fastify.log.error(err);
      return done(err);
    }
    console.log('DB Connected.');
  });
  fastify.register(InitDB, { initSqlPath }); // this initializes the DB
  fastify.after(err => {
    if (err) {
      fastify.log.error(err);
      return done(err);
    }
    console.log('DB Initialized.');
  });

  fastify.setErrorHandler(function errorHandler(error) {
    console.log(`got error`); // this is never called, even if an error happens during initialization of the DB
  });
  done();
};

这是第二个插件InitDB

const InitDB: FastifyPluginCallback<{ initSqlPath: string }> = async (
  fastify,
  { initSqlPath }: { initSqlPath: string },
  done
) => {
  try {
    const initSql = await (
      await promisify(readFile)(join(resolve(), initSqlPath))
    ).toString();
    await fastify.pg.pool.query(initSql);
    console.log({ initSql });
  } catch (err: Error | unknown) {
    return done(err as Error);
  }
  done();
};

当错误发生在 InitDB 插件中时,我看到它被 fastify 记录器记录下来,但我无法在 setErrorHandler.

中捕获它

我如何捕获恰好在我的自定义插件中发生的任何错误,并让 fastify 处理所有其他错误?

你不需要 errorHandler 因为它是为 HTTP 错误触发的,而不是为 fastify 服务器启动错误。

归档您的需求非常简单:

// when there is an async func, the `done` arg must be removed
const ConnectAndInitDB = async function (fastify, { config, initSqlPath }) {
  await fastify.register(fastifyPostgres, config)
  console.log('DB Connected.')

  try {
    await fastify.register(InitDB, { initSqlPath }) 
    console.log('DB Initialized.')
  } catch (error) {
    console.log(`got error`)
    throw error // bubble up the error so fastify server will not start
  }
}