Fastify - 自定义错误处理程序中的 i18next

Fastify - i18next in custom error handler

在我的 Node.js 应用程序中,我使用 fastify 作为框架以及一些插件 (i18next)。 我使用 i18next 进行翻译(在 preHandler 和处理程序挂钩中正常工作)并希望通过在我的自定义错误处理程序中使用 i18next 的翻译来自定义所有错误(通过 fastify setErrorHandler 方法)。

到目前为止,这是我的编码(从上到下):

import fastify from "fastify";
import routes from "./routes/routes.js";


import i18next from "./config/i18next.js";
import i18nextMiddleware from "i18next-http-middleware";

const app = fastify({
    logger: true,
    ajv: {
        customOptions: {
            allErrors: true,
            $data: true
        }
    },
});

app.register(i18nextMiddleware.plugin, { i18next });

app.register(routes, { prefix: '/api/v1' });

app.setErrorHandler((error, request, reply) => {
    console.log('request.t: ', request.t);
    if (error.validation) {
        // other coding ...
        reply.send(error);
    }
});

(async () => {
    try {
        await app.listen(process.env.PORT);
        console.log(`Server started listening on port ${process.env.PORT}`);
    } catch (err) {
        app.log.error(err);
    }
})();

在 setErrorHandler(同步)中,我想使用传递给请求对象的 i18next 实例中的初始化 t() 方法(这适用于我在 preHandler 和处理程序挂钩中的所有路由)但在setErrorHandler,因为当发生错误时我会得到 undefined。 我知道 setErrorHandler 是同步的,所有插件注册都会异步处理,但还没有解决。

我也尝试过在注册 i18next 插件时在 after() 挂钩中调用 setErrorHandler,但结果是一样的。我知道我遗漏了一个小细节,但任何提示都将受到赞赏,因为几个小时以来我一直在思考这个问题。

发生这种情况是因为 i18next-http-middleware 插件将 t 方法添加到执行的 preHandler 挂钩上的 request 对象 after the JSON validation step:

export function plugin (instance, options, next) {
  const middleware = handle(options.i18next, options)
  instance.addHook('preHandler', (request, reply, next) => middleware(request, reply, next))
  return next()
}

source

您应该能够像这样编写解决方法:

import i18nextMiddleware from "i18next-http-middleware";

// ....

const middleware = i18nextMiddleware.handle({})
app.addHook('preValidation', (request, reply, next) => middleware(request, reply, next))

我认为这是模块的错误