在Strapi中,自定义控制器是一种强大的工具,允许开发者扩展或修改应用程序的核心功能。如果你想在创建新记录时增加一些副作用,比如发送通知、更新其他相关记录或触发外部API调用,可以通过自定义控制器来实现。
控制器(Controller):在Strapi中,控制器是处理业务逻辑的地方。它们接收来自路由的请求,执行必要的操作,并返回响应。
副作用(Side Effect):指的是除了主要功能之外的额外操作。例如,在创建一个新用户后发送欢迎邮件就是一个副作用。
假设我们要在创建一个新的Article
记录时发送一封电子邮件通知。
src/api/article/controllers/article.js
文件(如果没有,可以创建它)。const { sanitizeEntity } = require('strapi-utils');
module.exports = {
async create(ctx) {
let entity;
if (ctx.is('multipart')) {
const { data, files } = await ctx.receiveMultipart();
entity = await strapi.services.article.create(data, { files });
} else {
entity = await strapi.services.article.create(ctx.request.body);
}
// 发送电子邮件通知
this.sendNotification(entity);
return sanitizeEntity(entity, { model: strapi.models.article });
},
sendNotification(article) {
// 这里可以调用你的邮件发送服务
console.log(`Sending notification for new article: ${article.title}`);
// 示例:使用Nodemailer发送邮件
// const transporter = nodemailer.createTransport({...});
// const mailOptions = {...};
// transporter.sendMail(mailOptions, (error, info) => {
// if (error) {
// console.error(error);
// } else {
// console.log('Email sent: ' + info.response);
// }
// });
}
};
问题1:邮件发送失败
问题2:性能问题
以下是一个完整的示例,展示了如何在创建文章时发送电子邮件通知:
const { sanitizeEntity } = require('strapi-utils');
const nodemailer = require('nodemailer');
module.exports = {
async create(ctx) {
let entity;
if (ctx.is('multipart')) {
const { data, files } = await ctx.receiveMultipart();
entity = await strapi.services.article.create(data, { files });
} else {
entity = await strapi.services.article.create(ctx.request.body);
}
this.sendNotification(entity);
return sanitizeEntity(entity, { model: strapi.models.article });
},
sendNotification(article) {
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'your-email@gmail.com',
pass: 'your-email-password'
}
});
const mailOptions = {
from: 'your-email@gmail.com',
to: 'recipient@example.com',
subject: 'New Article Created',
text: `A new article "${article.title}" has been created.`
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.error('Error sending email:', error);
} else {
console.log('Email sent:', info.response);
}
});
}
};
通过这种方式,你可以灵活地在Strapi中添加各种副作用,以满足不同的业务需求。
领取专属 10元无门槛券
手把手带您无忧上云