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 中的应用设置代码不是 运行.

最好的解决方案是使用 i18ninstance 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');
}