在快速 JS 中使用全局翻译对象
Using a global translation object in express JS
>我为 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();
});
因为它看起来像您正在配置一个共享的全局转换器对象,然后期望稍后使用它,并期望它不会被任何其他请求更改。 这似乎是在自找麻烦。
如果请求处理程序在任何时候进行任何异步调用,则可以运行另一个请求处理程序,这可能会产生冲突,因为两者都尝试使用相同的转换器对象。
- 全局变量和全局对象的属性之间有什么区别吗
- 正在全局范围中查找JavaScript函数
- 如何在javascript上使用flak-babel进行翻译
- delete关键字在全局变量上的不同行为
- 在javascript函数中设置全局变量
- 如何将getJson的响应保存在全局变量中
- 全局对象是属于哪个类的对象
- Javascript全局onclick监听器
- 从Javascript方法返回全局变量
- 访问jsrender模板中的全局javascript变量并更新它
- 使用谷歌网站翻译器自动翻译网页
- javascript无法重新定义函数内部的全局对象
- javascript 中的全局函数
- cordova:例外:财产'requestFileSystem'的[对象全局]不是函数
- jsi18n-django.catogue没有'不包含任何已翻译的字符串(但是djangojs.mo包含)
- 全局安装gull后出错
- AngularJS中的封装窗口全局变量
- 全局标志仅与第一个匹配项匹配的Regexp
- 如何在全局变量中通过角度平移存储翻译的值
- 在快速 JS 中使用全局翻译对象