Привязка пользовательских глобальных переменных в Node.js
Я использовал пакет экспресс-валидатора для проверки и пакет i18n для глобализации в своем проекте Node.js. Как вы видите, я использую и настраиваю эти два пакета таким образом. Обратите внимание, что i18n связан с глобальной переменной:
// app-config.js
const path = require('path');
const logger = require('morgan');
const bodyParser = require('body-parser');
const i18n = require('i18n');
const globalConfig = require('../../infrastructure/config/global-config');
const expressValidator = require('express-validator');
module.exports = (app,express)=>{
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
// view engine setup ##I need to manage and handle all works on views later!
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
app.use(i18n.init);
i18n.configure({
locales:['en','fa'],
directory:`${globalConfig.rootPath}/locales`,
register:global,
objectNotation:true,
defaultLocale:'fa'
});
console.log(__('messages.validationMessages.itemIsRequired', { item: t('fields.address') } ));
app.use(expressValidator());
};
Каждый из этих двух пакетов работает хорошо отдельно. На самом деле, эта строка в приведенном выше коде эти строки кода работает как шарм:
console.log(__('messages.validationMessages.itemIsRequired', { item: t('fields.address') } ));
Но проблема в использовании переменной __ в другом файле. Например, когда я хочу использовать эту переменную с withMessage(...)
функция экспресс-валидатора следующим образом:
const { check, oneOf, validationResult } = require('express-validator/check');
const { matchedData, sanitize } = require('express-validator/filter');
const i18n = require('i18n');
module.exports = class AddStaffViewModel {
constructor() {
this.staffFullName = '';
this.staffMobileNumber = '';
this.staffUserName= '';
this.staffPassword = '';
this.address = '';
}
validate(req) {
return [
sanitize('staffFullName').trim(),
sanitize('staffMobileNumber').trim(),
sanitize('staffUserName').trim(),
sanitize('staffPassword').trim(),
sanitize('address').trim(),
check('staffFullName')
.exists().withMessage( __('messages.validationMessages.itemIsRequired', { item: __('fields.fullName') } ) )
.isLength( { min:2, max: 50 } ).withMessage( __('messages.validationMessages.itemValueLengthIsNotValid', { item: __('fields.fullName') } ) ),
check('staffMobileNumber')
.exists().withMessage( __('messages.validationMessages.itemIsRequired', { item: __('fields.mobileNumber') } ) )
.isLength( { min:2, max: 50 } ).withMessage( __('messages.validationMessages.itemValueLengthIsNotValid', { item: __('fields.mobileNumber') } ) ),
check('staffUserName')
.exists().withMessage( __('messages.validationMessages.itemIsRequired', { item: __('fields.userName') } ) )
.isLength( { min:2, max: 50 } ).withMessage( __('messages.validationMessages.itemValueLengthIsNotValid', { item: __('fields.userName') } ) ),
check('staffPassword')
.exists().withMessage( __('messages.validationMessages.itemIsRequired', { item: __('fields.password') } ) )
.isLength( { min:2, max: 50 } ).withMessage( __('messages.validationMessages.itemValueLengthIsNotValid', { item: __('fields.password') } ) ),
check('address')
.exists().withMessage( __('messages.validationMessages.itemIsRequired', { item: __('fields.address') } ) )
.isLength( { min:2, max: 1024 } ).withMessage( __('messages.validationMessages.itemIsRequired', { item: __('fields.address') }) )
];
}
}
Объект req передается для проверки функции вышеуказанного класса следующим образом:
async create(req, res, next) {
try {
var addStaffViewModel = new AddStaffViewModel();
addStaffViewModel.validate(req);
const validationResult = await req.getValidationResult();
if(!validationResult.isEmpty()) {
_reponseHandler.setFailureStatus(validationResult.array(), __('messages.validationMessages.message'));
res.status(200).send(_reponseHandler);
return;
}
res.status(200).send();
return;
} catch(err) {
console.error(err);
return next(err);
}
}
Выдается ошибка, когда я перезапускаю процесс Node.js и говорит, что:
**
ReferenceError: __ не определено в AddStaffViewModel.validate
**
Я обнаружил, что когда я хочу использовать глобальную __- переменную i18n в AddStaffViewModel с withMessage(...), Node.js все еще не знает глобальную __-переменную (__ является частью пакета i18n), а также когда эта ошибка произошло, то команда console.log(...) в app-config.js не запускается.
На самом деле я в замешательстве. Любая помощь, чтобы решить эту проблему.
Признательность