在提交表单并尝试翻译验证错误信息时,req.t不是一个函数

前端开发 2026-07-09

在TypeScript的 Express项目中设置 i18next 中间件。

realestate\middleware\localization.ts

import i18next from "i18next";
import Backend from "i18next-fs-backend";
import { LanguageDetector } from "i18next-http-middleware";

i18next
  .use(Backend)
  .use(LanguageDetector)
  .init({
    lng: "sr",
    ns: ["messages", "fields"],
    fallbackLng: "en",
    backend: { loadPath: `../lang/{{lng}}/{{ns}}.json` }
  }); // [1]

// [1] https://www.youtube.com/watch?v=P6HxWBox74g

在验证规则中翻译错误信息。

realestate\validation\authSchemas.ts

// 2 input validation & sanitization
export const registerSchema = checkSchema({
  email: {
    notEmpty: { errorMessage: (_value, { req }) => req.t("messages:field.required", { attr: req.t("fields:email") }) },
    isEmail: { errorMessage: (_value, { req }) => req.t("messages:email.email", { attr: req.t("fields:email") }) }
  },

它被使用的路由:

realestate\routes\index.ts

const router = Router();
// 6 Rate limiting
router.get("", (_req, res, _next) => res.redirect("/oglasi"));

显示错误信息的表单。

realestate\views\auth\register.ejs

<div class="row">
  <div class="col-md-6 col-lg-4">
    <!-- 4 Authentication & autorization -->
    <form class="border border-secondary-subtle rounded-3 p-3 mb-3" action="/registracija" method="post" novalidate>
      <p class="mb-3">Imaš nalog? <a class="fw-semibold" href="/prijava">Prijavi se</a></p>

      <!-- 3 CSRF tokens -->
      <input type="hidden" name="_csrf" value="<%= csrfToken %>" />

      <% if (locals.fail) { %>
      <div class="row mb-3">
        <div class="col-12">
          <div class="alert alert-danger"><%- fail %></div>
        </div>
      </div>
      <% } %>

      <div class="row mb-3">
        <label class="col-sm-4 col-form-label fw-semibold" for="email">Imejl adresa</label>
        <div class="col-sm-8">
          <input class="form-control" type="email" id="email" name="email" value="<%= old?.email %>">
          <% if (locals.errors && errors["email"]) { %>
          <span class="form-text text-danger"><%= errors["email"].msg %></span>
          <% } %>
        </div>
      </div>

当我提交表单时,出现错误:req.t 不是一个函数。

TypeError: req.t is not a function
    at errorMessage (D:\Documents\_Dokumenti\Projekti\_Master\Real Estate App\Node\secure\realestate\validation\authSchemas.ts:8:97)
    at Context.addError (D:\Documents\_Dokumenti\Projekti\_Master\Real Estate App\Node\secure\realestate\node_modules\express-validator\lib\context.js:69:54)
    at D:\Documents\_Dokumenti\Projekti\_Master\Real Estate App\Node\secure\realestate\node_modules\express-validator\lib\context-items\standard-validation.js:20:25
    at Array.forEach (<anonymous>)
    at StandardValidation.run (D:\Documents\_Dokumenti\Projekti\_Master\Real Estate App\Node\secure\realestate\node_modules\express-validator\lib\context-items\standard-validation.js:17:16)
    at D:\Documents\_Dokumenti\Projekti\_Master\Real Estate App\Node\secure\realestate\node_modules\express-validator\lib\chain\context-runner-impl.js:41:39
    at Array.map (<anonymous>)
    at ContextRunnerImpl.run (D:\Documents\_Dokumenti\Projekti\_Master\Real Estate App\Node\secure\realestate\node_modules\express-validator\lib\chain\context-runner-impl.js:34:70)
    at middleware (D:\Documents\_Dokumenti\Projekti\_Master\Real Estate App\Node\secure\realestate\node_modules\express-validator\lib\middlewares\check.js:15:26)
    at Layer.handleRequest (D:\Documents\_Dokumenti\Projekti\_Master\Real Estate App\Node\secure\realestate\node_modules\router\lib\layer.js:152:17)

消息与属性: realestate\lang\sr\messages.json

{
  "field": {
    "alpha": "Polje {{attr}} mora sadržati samo slova.",

realestate\lang\sr\fields.json

{
  "birthDate": "datum rođenja",
  "currPassword": "trenutna šifra",
  "email": "imejl adresa",

解决方案

你得到的错误 TypeError: req.t is not a function 通常出现在下面这行代码缺失或顺序错误时

app.use(middleware.handle(i18next));

基本上,这几行代码的意思是在每个请求到达前就执行i18next中间件。

如果该行缺失,请添加;如果不缺,请检查它的添加顺序,应该在使用路由之前添加,如下所示

app.use(middleware.handle(i18next));
app.use("/auth", authRoutes);
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章