【问题标题】:Using a global translation object in express JS在 express JS 中使用全局翻译对象
【发布时间】:2016-02-15 20:21:34
【问题描述】:

我为 Express JS 构建了一个非常简单的翻译模块,它是应用程序范围内的一个全局对象,在应用程序运行时被实例化:

translator.configure({
    translations: 'translations.json'
});

我在 Express JS 中添加了一些简单的中间件,可以为每个请求更改翻译模块中的语言环境:

app.use(function(req, res, next) {
    var locale = // Get locale from request host header

    // Setup the translator
    translator.setLocale(locale);

    // Attach translator to request parameters
    res.locals.__ = translator.translations;

    // Pass control to the next middleware function
    next();
});

然后我通过我的视图中的变量__ 访问我的翻译(这里我使用ejs):

...
Here is my translated text: <%= __['test'] %>
...

我的翻译模块如下所示:

var translations,
    locale;

// public exports
var translator = exports;

translator.configure = function(opt) {
    translations = require('./' + opt.translations);
};

translator.setLocale = function(locale) {
    translator.translations = translations[locale];
}

translations.json 文件只是一个简单的 JSON 结构:

{
    "us":{
        "test": "Hello!"
    },
    "es":{
        "test": "Hola!"
    }
}

我的问题是,这种整体结构是个坏主意吗?我对 express JS 没有广泛的了解。全局对象让我有点紧张,因为翻译是基于它的当前状态,从请求到请求都会改变,这里有什么问题吗? express JS 是否在处理下一个请求之前完全完成了一个请求,或者是否存在某种程度的并发会弄乱我的翻译?

【问题讨论】:

  • @stdob-- 谢谢,但这基本上是我基于我自己的代码的模块。我认为这个模块对于我的目的来说看起来有点矫枉过正,我需要一些比这更灵活的东西。

标签: javascript json node.js express internationalization


【解决方案1】:

全局对象不适合保存请求期间使用的状态。一个请求不一定在下一个请求开始运行之前完成。如果在任何时候,请求处理程序进行异步调用(例如读取文件),那么另一个请求可以在该点开始运行。

通常,您应该将与特定请求相关的状态存储在请求对象本身上。这样一来,它就不是全局的,而是专门为该请求存储的,您可以同时处理尽可能多的请求而不会发生冲突。

因此,理想情况下,您完全可以不将任何特定于请求的状态存储在您的翻译器对象中,除非您为每个请求创建一个新的翻译器对象,然后将该特定翻译器对象存储在请求对象中。

我没有完全按照你的翻译代码,但这看起来很麻烦:

app.use(function(req, res, next) {
    var locale = // Get locale from request host header

    // Setup the translator
    translator.setLocale(locale);

    // Attach translator to request parameters
    res.locals.__ = translator.translations;

    // Pass control to the next middleware function
    next();
});

因为看起来您正在配置一个共享的全局翻译器对象,然后期望稍后使用它并期望它不会被任何其他请求更改。好像是自找麻烦。

如果您的请求处理程序在任何时候进行任何异步调用,则可以运行另一个请求处理程序,这可能会产生冲突,因为两者都尝试使用相同的转换器对象。

【讨论】:

  • 谢谢!这正是我担心的情况,所以我会尝试解决这个问题。
猜你喜欢
  • 2014-12-20
  • 2023-03-25
  • 2016-02-12
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多