ARTICLE AD BOX
Setting up the i18next middleware in TypeScript Express project.
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=P6HxWBox74gTranslating error messages in validation schema.
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") }) } },The route where it's used:
realestate\routes\index.ts:
const router = Router(); // 6 Rate limiting router.get("", (_req, res, _next) => res.redirect("/oglasi"));The form where the error messages are shown.
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>When I submit the form, I get an error that req.t is not an function.
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)