在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
,因为必须将文档分别插入每个语言环境。
如果您不使用本地化,您可能想知道为什么这样做是必要的。答案是普通的编辑/提交/提交工作流仍使用两个语言环境,分别称为default
和default-draft
。
如果工作流适合于要提交的内容,例如,在批准和提交工作流之前,它将作进一步草稿编辑,那么您应该在afterInsert
处理程序中对此进行说明。您可以查看piece.workflowLocale
来确定要处理的语言环境。
如果此内容类型不需要工作流,只需将其添加到excludeTypes
模块配置中的apostrophe-workflow
数组选项中即可。此处要记住的一件事:工作流中排除的类型不能与具有工作流的类型一起使用。但是,您可以执行相反的操作(具有工作流程的类型可以与排除的类型合并)。此限制可能会在3.x版本中取消。
关于javascript - Apostrophe CMS-afterInsert被多次调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57559108/