You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express集成i18next-http-middleware报错:req.t不是函数

问题

配置Express应用的i18next-http-middleware,希望通过查询参数lng检测语言,但运行时出现错误:

TypeError: req.t is not a function

初始化配置代码:

const express = require("express");
const bodyParser = require("body-parser");
const i18next = require('i18next');
const middleware = require('i18next-http-middleware');
const Backend = require('i18next-fs-backend');

const logger = require('./util/logger');

const translationTest = require('./translationTest');

const router = express.Router();

router.use('/translation', translationTest);

i18next
    .use(Backend)
    .use(middleware.LanguageDetector)
    .init({
        ns: ['common'],
        defaultNS: 'common',
        preload: ['en', 'de'],
        fallbackLng: 'en',
        // supportedLngs: ['en', 'de'],
        detection: {
            order: ['querystring'],
            lookupQuerystring: 'lng',
            caches: false,
            ignoreCase: true
        },
        debug: true,
        backend: {
            loadPath: 'locales/{{ns}}/{{ns}}_{{lng}}.json'
        },
        initImmediate: false
        
    });

const app = express();
app.use(logger);
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.use('/', router);

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

const port = parseInt(process.env.PORT) || 3000;
const server = app.listen(port, () => {
    console.log(`Listening at http://localhost:${port}`);
});

测试文件代码:

const express = require('express');

const router = express.Router();

router.get("/", async (req, res) => {

    res.send(req.t('common:test'));
});

module.exports = router;
解决方案

核心问题是中间件挂载顺序错误:middleware.handle(i18next)需要在路由之前挂载,否则请求到达路由时,i18next还未给req注入t方法。

修正后的初始化代码调整顺序如下:

const express = require("express");
const bodyParser = require("body-parser");
const i18next = require('i18next');
const middleware = require('i18next-http-middleware');
const Backend = require('i18next-fs-backend');

const logger = require('./util/logger');

const translationTest = require('./translationTest');

// 先完成i18next初始化
i18next
    .use(Backend)
    .use(middleware.LanguageDetector)
    .init({
        ns: ['common'],
        defaultNS: 'common',
        preload: ['en', 'de'],
        fallbackLng: 'en',
        // supportedLngs: ['en', 'de'],
        detection: {
            order: ['querystring'],
            lookupQuerystring: 'lng',
            caches: false,
            ignoreCase: true
        },
        debug: true,
        backend: {
            loadPath: 'locales/{{ns}}/{{ns}}_{{lng}}.json'
        },
        initImmediate: false
        
    });

const app = express();
app.use(logger);
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());

// 先挂载i18next中间件,再挂载路由
app.use(middleware.handle(i18next));

const router = express.Router();
router.use('/translation', translationTest);
app.use('/', router);

const port = parseInt(process.env.PORT) || 3000;
const server = app.listen(port, () => {
    console.log(`Listening at http://localhost:${port}`);
});

关键说明:

  • Express中间件按挂载顺序执行,必须确保i18next的中间件在所有路由之前运行,这样才能在请求进入路由处理前,完成语言检测并给req添加t方法。
  • 同时要确认翻译文件路径正确,比如locales/common/common_en.json和locales/common/common_de.json存在,且包含test字段的翻译内容。

内容的提问来源于stack exchange,提问作者Peter Samyn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 13:43:12