在 express 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!"
}
}
我的问题是,这种整体结构是不是一个坏主意?我对 express JS 没有广泛的了解。全局对象让我有点紧张,因为翻译是基于它的当前状态,随着请求的不同而变化,这里有什么问题吗? Express JS 是否会在处理下一个请求之前完全完成一个请求,或者是否存在某种程度的并发性可能会扰乱我的翻译?
全局对象不适合保存请求期间使用的状态。一个请求不一定在下一个请求开始 运行ning 之前完成。如果在任何时候请求处理程序进行异步调用(例如读取文件),那么另一个请求可以在那个时候开始 运行ning。
一般来说,您应该将与特定请求相关的状态存储在请求对象本身上。这样,它就不是全局的,而是专门为该请求存储的,您可以同时处理尽可能多的请求而不会发生冲突。
因此,理想情况下,您可以根本不在翻译器对象中存储任何特定于请求的状态,除非您为每个请求创建一个新的翻译器对象,然后将该特定的翻译器对象存储在请求对象中。
我没有完全按照你的翻译代码,但这看起来很麻烦:
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();
});
因为看起来您正在配置一个共享的全局翻译器对象,然后期望稍后使用它并且期望它不会被任何其他请求更改。好像是自找麻烦
如果您的请求处理程序在任何时候进行任何异步调用,那么另一个请求处理程序可以 运行 这可能会产生冲突,因为两者都尝试使用相同的翻译器对象。
我已经为 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 是否会在处理下一个请求之前完全完成一个请求,或者是否存在某种程度的并发性可能会扰乱我的翻译?
全局对象不适合保存请求期间使用的状态。一个请求不一定在下一个请求开始 运行ning 之前完成。如果在任何时候请求处理程序进行异步调用(例如读取文件),那么另一个请求可以在那个时候开始 运行ning。
一般来说,您应该将与特定请求相关的状态存储在请求对象本身上。这样,它就不是全局的,而是专门为该请求存储的,您可以同时处理尽可能多的请求而不会发生冲突。
因此,理想情况下,您可以根本不在翻译器对象中存储任何特定于请求的状态,除非您为每个请求创建一个新的翻译器对象,然后将该特定的翻译器对象存储在请求对象中。
我没有完全按照你的翻译代码,但这看起来很麻烦:
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();
});
因为看起来您正在配置一个共享的全局翻译器对象,然后期望稍后使用它并且期望它不会被任何其他请求更改。好像是自找麻烦
如果您的请求处理程序在任何时候进行任何异步调用,那么另一个请求处理程序可以 运行 这可能会产生冲突,因为两者都尝试使用相同的翻译器对象。