【问题标题】:User fields empty in parse-server server.js mail adapterparse-server server.js 邮件适配器中的用户字段为空
【发布时间】:2018-04-24 20:23:23
【问题描述】:

我使用parse-server-amazon-ses-email-adapter,想知道如何本地化验证电子邮件和重置密码电子邮件。

我的线索是检查用户的字段,然后在server.jsAmazonSESAdapter.js 上分配正确的模板。问题是用户属性是空的,除了电子邮件、用户名。

例如,在下面的示例中,firstName 未定义。

谢谢。

emailAdapter: {
      module: 'parse-server-amazon-ses-email-adapter',
      options: {
        // The address that your emails come from
        fromAddress: 'Iron rr',
        accessKeyId: 'gg',
        secretAccessKey: 'gg',
        region: 'eu-west-1',
        // The template section
        templates: {
          passwordResetEmail: {
            subject: 'Redefinir sua senha Iron Trainers',
            pathPlainText: '/opt/bitnami/apps/parse/htdocs/node_modules/parse-server/node_modules/parse-server-amazon-ses-email-adapter/test/email-templates/password_reset_email.txt',
            pathHtml: '/opt/bitnami/apps/parse/htdocs/node_modules/parse-server/node_modules/parse-server-amazon-ses-email-adapter/test/email-templates/password_reset_email.html',
            callback: (user) => {
                return {
                  firstName: user.get('firstName')
                }
              }
              // Now you can use {{firstName}} in your templates
          },
          verificationEmail: {
            subject: 'Confirmar email no Iron Trainers',
            pathPlainText: '/opt/bitnami/apps/parse/htdocs/node_modules/parse-server/node_modules/parse-server-amazon-ses-email-adapter/test/email-templates/verification_email.txt',
            pathHtml: '/opt/bitnami/apps/parse/htdocs/node_modules/parse-server/node_modules/parse-server-amazon-ses-email-adapter/test/email-templates/resendEmailVerification.html',
            callback: (user) => {
                return {
                  firstName: user.get('firstName')
                }
              }
              // Now you can use {{firstName}} in your templates
          },
          customEmailAlert: {
            subject: 'Urgent notification!',
            pathPlainText: '/opt/bitnami/apps/parse/htdocs/node_modules/parse-server/node_modules/parse-server-amazon-ses-email-adapter/test/email-templates/custom_alert.txt',
            pathHtml: '/opt/bitnami/apps/parse/htdocs/node_modules/parse-server/node_modules/parse-server-amazon-ses-email-adapter/test/email-templates/custom_alert.html',
          }
        }

【问题讨论】:

  • 本地化是指eneu 语言类型本地化还是其他?
  • 是的,语言翻译。谢谢。
  • 你也可以发server.js吗?
  • 以上代码来自server.js,我也可以贴出完整的文件/代码。
  • 是的,做同样的粘贴,删除所有机密信息。

标签: javascript node.js parse-platform parse-server


【解决方案1】:

据我了解,这可以通过插件中的代码更改来完成。

代码下面一行有一个if-else 条件

https://github.com/ecohealthalliance/parse-server-amazon-ses-email-adapter/blob/0bce9b6c81681c3829a17b208d839d23c846ab05/src/AmazonSESAdapter.js#L90

由于您没有提供任何反馈,我也没有办法设置它,我假设 else 部分是被执行的部分

  const {
    link,
    appName,
    user,
    templateConfig
  } = options;
  const {
    callback
  } = templateConfig;
  let userVars;

  if (callback && typeof callback === 'function') {
    userVars = callback(user);
    // If custom user variables are not packaged in an object, ignore it
    const validUserVars = userVars && userVars.constructor && userVars.constructor.name === 'Object';
    userVars = validUserVars ? userVars : {};
  }

  pathPlainText = templateConfig.pathPlainText;
  pathHtml = templateConfig.pathHtml;

  templateVars = Object.assign({
    link,
    appName,
    username: user.get('username'),
    email: user.get('email')
  }, userVars);

  message = {
    from: this.fromAddress,
    to: user.get('email'),
    subject: templateConfig.subject
  };
}

现在在这部分,2行决定要使用的模板

pathPlainText = templateConfig.pathPlainText;
pathHtml = templateConfig.pathHtml;

此时,您提供的callback 已被调用。现在在回调中你可以设置一个变量,假设它的名字是locale。所以你可以像下面这样更新代码

pathPlainText = templateConfig.pathPlainText + (userVars["locale"] || "en");
pathHtml = templateConfig.pathHtml + (userVars["locale"] || "en");

然后您将创建在文件路径中包含locale 的模板,并使用更新的代码选择正确的模板。

你也可以看看@bgran的答案,乍一看我相信应该也可以

【讨论】:

  • 这肯定会起作用,但如果你想使用它,你需要 fork parse-server-amazon-ses-email-adapter。下面的答案将适用于现有的parse-server-amazon-ses-email-adapter
  • 是的,完全同意并在我的最后一行中突出显示
  • @TarunLalwani,非常感谢,这非常有效。虽然,我还有一个问题......我如何访问回调中的另一个解析类,而不仅仅是用户对象?谢谢。
  • 很难说,因为如果它在一个你无法控制的范围内的对象中,那就很难了。类和实例也是两个不同的东西。如果你想使用类,你可以只需要它,但如果你需要一个实例,那么你需要进行代码修改,看看它们如何在两个作用域之间共享
【解决方案2】:

您需要在模板回调中进行本地化。

回调是同步的,因此您的所有本地化也需要同步。

emailTemplate.html

<div>
  {{localizedText}}
</div>

每个语言环境的其他模板:

emailTemplate.en.html

<p>
  Hi {{nome}}...
</p>

电子邮件逻辑:

// The same templater used by parse-server-amazon-ses-email-adapter
import template from 'lodash.template'

/* ... */

const TemplatesByLocale = {
  en: fs.readFileSync('./emailTemplate.en.html'),
}

verificationEmail: {
  /* ... */
  pathHtml: './path/to/emailTemplate.html',
  callback: (user) => {
    const locale = getLocaleSomehow(user) // needs to be synchronous
    const localizedTemplate = TemplatesByLocale[locale]

    const compiled = template(localizedTemplate, {
      // same interpolation as parse-server-amazon-ses-email-adapter
      interpolate: /{{([\s\S]+?)}}/g
    })
    const localizedText = compiled({
      nome: user.get('nome'), /* ... */
    })
    return {
      localizedText: localizedText,
    }
  },
  /* ... */
}

值得注意的是,parse-server-amazon-ses-email-adapter 在使用纯文本模板之前将使用 HTML 模板(通过 pathHtml 指定的模板),因此如果您指定了 HTML 模板,则可以省略 pathPlainText属性。

【讨论】:

  • 这行不通,因为需要根据变量做出决策,而不能在模板中完成
  • 您可以在模板回调中进行决策。猜猜这在答案中并不清楚,但是您在模板回调中进行本地化,然后在模板中呈现结果。
  • 你能在你的答案中添加一个相同的例子吗?
  • 没问题,加个例子。
  • 如果您需要为每个区域设置单独的模板文件,上面的示例将起作用。不过,这是对库的一种破解,您只需在模板回调中编写同步代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多