在快速 JS 中使用全局翻译对象

Using a global translation object in express JS

本文关键字:全局 翻译 对象 JS      更新时间:2023-09-26

>我为 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!"
    }
}

我的问题是,这种整体结构是一个坏主意吗?我对快速JS没有广泛的了解。全局对象让我有点紧张,因为翻译是基于其当前状态的,该状态从一个请求更改为另一个请求,这里有任何问题吗?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();
});

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

如果请求处理程序

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