在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,因为必须将文档分别插入每个语言环境。

如果您不使用本地化,您可能想知道为什么这样做是必要的。答案是普通的编辑/提交/提交工作流仍使用两个语言环境,分别称为defaultdefault-draft

如果工作流适合于要提交的内容,例如,在批准和提交工作流之前,它将作进一步草稿编辑,那么您应该在afterInsert处理程序中对此进行说明。您可以查看piece.workflowLocale来确定要处理的语言环境。

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

关于javascript - Apostrophe CMS-afterInsert被多次调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57559108/

10-12 19:04