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
相关产品推荐
相关产品推荐

