撇号 CMS - 多次调用 afterInsert

Apostrophe CMS - afterInsert is called multiple times

在 Apostrophe CMS 中,我希望使用 apostrophe-submit-widgets 提交一篇文章 - 一切似乎都正常,只是我的 afterInsert 方法被调用了两次,因此发送了两倍数量的电子邮件。

我的配置是这样的:

const nodemailer = require('nodemailer')
const colors = require('colors')

module.exports = {
  extend: 'apostrophe-pieces',
  name: 'request-form',
  label: 'Request Form',
  alias: 'requestForm',
  //...
  ],
  construct: function (self, options) {
    self.beforeSave = function (req, piece, options, callback) {
      piece.title = piece.name + ' ' + piece.email
      piece.published = true
      return callback()
    }
    self.afterInsert = async function (req, piece, options, callback) {
      const transporter = nodemailer.createTransport({
        //transport config
      });

      function handleError(err) {
        console.error(err.cyan)
        return callback(err)
      }

      const messageToAdmin = {
        //nodemailer message config
      }


      const messageToUser = {
        //nodemailer message config
      }

      await transporter.sendMail(messageToAdmin)
        .then(transporter.sendMail(messageToUser))
        .catch(handleError)

      return callback()
    }
  }
}

你知道它为什么会那样工作吗?我用调试工具唯一能找到的是 afterInsert 确实被调用了两次,它不是循环的内部东西。 当我使用 request-forms-submit-widgets 和从管理栏添加它时都会发生。

编辑:根据建议,我删除了 then 链接并改为使用:

try {
  await transporter.sendMail(messageToAdmin)
  await transporter.sendMail(messageToUser)
  callback()
} catch (err) {
  console.error(err)
  callback(err)
}

不幸的是,它没有帮助。

如果您正在使用 apostrophe-workflow,您可能会多次调用 afterInsert,因为文档必须分别插入到每个语言环境中。

如果您不使用本地化,您可能想知道为什么这是必要的。答案是普通的 edit/submit/commit 工作流程仍然使用两个语言环境,称为 defaultdefault-draft

如果工作流程适合所提交的内容,例如在批准和提交之前将作为草稿进一步编辑,那么您应该在 afterInsert 处理程序中考虑到这一点。您可以查看 piece.workflowLocale 以确定您正在处理的语言环境。

如果此内容类型不需要工作流程,只需将其添加到 apostrophe-workflow 模块配置中的 excludeTypes 数组选项即可。只有一件事要记住:从工作流中排除的类型不能 join 具有工作流的类型。但是,您可以执行相反的操作(具有工作流的类型可以与被排除的类型连接)。此限制可能会在 3.x.

中取消