如何使用 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
}
}
在我的应用程序中,我连接到一个数据库,然后对其进行初始化。我有两个自定义插件。第一个插件连接到数据库,然后它注册第二个插件,它初始化数据库(创建表、域等)
如果这两个插件内部发生错误,我想停止进程,因为没有数据库连接和初始化,应用程序将无法运行。
在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
}
}