撇号 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 工作流程仍然使用两个语言环境,称为 default
和 default-draft
。
如果工作流程适合所提交的内容,例如在批准和提交之前将作为草稿进一步编辑,那么您应该在 afterInsert
处理程序中考虑到这一点。您可以查看 piece.workflowLocale
以确定您正在处理的语言环境。
如果此内容类型不需要工作流程,只需将其添加到 apostrophe-workflow
模块配置中的 excludeTypes
数组选项即可。只有一件事要记住:从工作流中排除的类型不能 join
具有工作流的类型。但是,您可以执行相反的操作(具有工作流的类型可以与被排除的类型连接)。此限制可能会在 3.x.
中取消
在 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 工作流程仍然使用两个语言环境,称为 default
和 default-draft
。
如果工作流程适合所提交的内容,例如在批准和提交之前将作为草稿进一步编辑,那么您应该在 afterInsert
处理程序中考虑到这一点。您可以查看 piece.workflowLocale
以确定您正在处理的语言环境。
如果此内容类型不需要工作流程,只需将其添加到 apostrophe-workflow
模块配置中的 excludeTypes
数组选项即可。只有一件事要记住:从工作流中排除的类型不能 join
具有工作流的类型。但是,您可以执行相反的操作(具有工作流的类型可以与被排除的类型连接)。此限制可能会在 3.x.