撇号 CMS - afterInsert 被多次调用



在撇号 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以确定您正在处理的区域设置。

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

最新更新