node.js i18n: "ReferenceError: __ is not defined"
node.js i18n: "ReferenceError: __ is not defined"
在我的整个应用程序中,我使用 i18n
没有问题。但是,对于通过 cron 作业发送的电子邮件,我收到错误:
ReferenceError: __ is not defined
在app.js
我配置i18n:
const i18n = require("i18n");
i18n.configure({
locales: ["en"],
register: global,
directory: path.join(__dirname, "locales"),
defaultLocale: "en",
objectNotation: true,
updateFiles: false,
});
app.use(i18n.init);
在我的整个应用程序中,我都将其用作 __('authentication.flashes.not-logged-in')
,就像我说的那样没有问题。在 cron 作业调用的邮件控制器中,我以相同的方式使用它:__('mailers.buttons.upgrade-now')
。然而,只有在那里,它才会产生上述错误。
为了尝试,我在邮件控制器中将其更改为 i18n.__('authentication.flashes.not-logged-in')
。但后来我得到另一个错误:
(node:11058) UnhandledPromiseRejectionWarning: TypeError: logWarnFn is not a function
at logWarn (/data/web/my_app/node_modules/i18n/i18n.js:1180:5)
知道如何使通过 cron 作业发送的电子邮件正常工作吗?
在评论中,提问者澄清说 cron 作业直接调用 mailController.executeCrons()
,而不是向应用程序发出 HTTP 请求。因此,i18n
全局对象永远不会被定义,因为 app.js
中的应用设置代码不是 运行.
最好的解决方案是使用 i18n
的 instance usage。您可以将 I18N
对象的实例化和配置分离到一个单独的函数中,然后在 app.js
中调用它以将其设置为 Express 中间件,并在 mailController.executeCrons()
函数中调用它以使用当通过 cronjob 调用时。
代码大纲:
i18n.js
(新文件)
const i18n = require("i18n");
// factory function for centralizing config;
// either register i18n for global use in handling HTTP requests,
// or register it as `i18nObj` for local CLI use
const configureI18n = (isGlobal) => {
let i18nObj = {};
i18n.configure({
locales: ["en"],
register: isGlobal ? global : i18nObj,
directory: path.join(__dirname, "locales"),
defaultLocale: "en",
objectNotation: true,
updateFiles: false,
});
return [i18n, i18nObj];
};
module.exports = configureI18n;
app.js
const configureI18n = require('./path/to/i18n.js');
const [i18n, _] = configureI18n(true);
app.use(i18n.init);
mailController.js
const configureI18n = require('./path/to/i18n.js');
const [_, i18nObj] = configureI18n(false);
executeCrons() {
i18nObj.__('authentication.flashes.not-logged-in');
}
在我的整个应用程序中,我使用 i18n
没有问题。但是,对于通过 cron 作业发送的电子邮件,我收到错误:
ReferenceError: __ is not defined
在app.js
我配置i18n:
const i18n = require("i18n");
i18n.configure({
locales: ["en"],
register: global,
directory: path.join(__dirname, "locales"),
defaultLocale: "en",
objectNotation: true,
updateFiles: false,
});
app.use(i18n.init);
在我的整个应用程序中,我都将其用作 __('authentication.flashes.not-logged-in')
,就像我说的那样没有问题。在 cron 作业调用的邮件控制器中,我以相同的方式使用它:__('mailers.buttons.upgrade-now')
。然而,只有在那里,它才会产生上述错误。
为了尝试,我在邮件控制器中将其更改为 i18n.__('authentication.flashes.not-logged-in')
。但后来我得到另一个错误:
(node:11058) UnhandledPromiseRejectionWarning: TypeError: logWarnFn is not a function
at logWarn (/data/web/my_app/node_modules/i18n/i18n.js:1180:5)
知道如何使通过 cron 作业发送的电子邮件正常工作吗?
在评论中,提问者澄清说 cron 作业直接调用 mailController.executeCrons()
,而不是向应用程序发出 HTTP 请求。因此,i18n
全局对象永远不会被定义,因为 app.js
中的应用设置代码不是 运行.
最好的解决方案是使用 i18n
的 instance usage。您可以将 I18N
对象的实例化和配置分离到一个单独的函数中,然后在 app.js
中调用它以将其设置为 Express 中间件,并在 mailController.executeCrons()
函数中调用它以使用当通过 cronjob 调用时。
代码大纲:
i18n.js
(新文件)
const i18n = require("i18n");
// factory function for centralizing config;
// either register i18n for global use in handling HTTP requests,
// or register it as `i18nObj` for local CLI use
const configureI18n = (isGlobal) => {
let i18nObj = {};
i18n.configure({
locales: ["en"],
register: isGlobal ? global : i18nObj,
directory: path.join(__dirname, "locales"),
defaultLocale: "en",
objectNotation: true,
updateFiles: false,
});
return [i18n, i18nObj];
};
module.exports = configureI18n;
app.js
const configureI18n = require('./path/to/i18n.js');
const [i18n, _] = configureI18n(true);
app.use(i18n.init);
mailController.js
const configureI18n = require('./path/to/i18n.js');
const [_, i18nObj] = configureI18n(false);
executeCrons() {
i18nObj.__('authentication.flashes.not-logged-in');
}