Javascript 如何通过自定义控制器在Strapi中创建新记录时添加副作用?
我试图在Strapi中添加新记录时触发一个副作用(使用socket.io发送通知)。套接字设置正常,成功地从后端(Strapi API)发送到前端。 我遵循了关于定制控制器的说明和本文中的建议,但没有提供帮助。更改控制器时不会发生任何情况-尝试通过将Javascript 如何通过自定义控制器在Strapi中创建新记录时添加副作用?,javascript,node.js,socket.io,strapi,Javascript,Node.js,Socket.io,Strapi,我试图在Strapi中添加新记录时触发一个副作用(使用socket.io发送通知)。套接字设置正常,成功地从后端(Strapi API)发送到前端。 我遵循了关于定制控制器的说明和本文中的建议,但没有提供帮助。更改控制器时不会发生任何情况-尝试通过将create函数体替换为return null来中断控制器或console.log(),但仍然为空。以下是。/controllers/Orders.js: 'use strict'; const { parseMultipartData, sanit
create
函数体替换为return null来中断控制器代码>或console.log(),但仍然为空。以下是。/controllers/Orders.js
:
'use strict';
const { parseMultipartData, sanitizeEntity } = require('strapi-utils');
module.exports = {
async create(ctx) {
let entity;
if (ctx.is('multipart')) {
const { data, files } = parseMultipartData(ctx);
entity = await strapi.api.order.services.order.create(data, { files });
} else {
entity = await strapi.api.order.services.order.create(ctx.request.body);
}
strapi.emitToAllUsers(entity);
return sanitizeEntity(entity, { model: strapi.query('order').model });
},
};
strapi.emitToAllUsers()
在bootstrap.js中定义。连接就绪消息和其他发出的数据在前端接收,但控制器内的内容似乎根本没有被调用。下面是bootstrap.js中的样板文件:
'use strict';
require('dotenv').config({ path: require('find-config')('.env') });
module.exports = () => {
var io = require('socket.io')(strapi.server);
var users = [];
io.on('connection', socket => {
socket.user_id = (Math.random() * 100000000000000); // not so secure
users.push(socket); // save the socket to use it later
socket.on('disconnect', () => {
users.forEach((user, i) => {
// delete saved user when they disconnect
if (user.user_id === socket.user_id) {
users.splice(i, 1);
}
});
});
io.emit('emit_test');
});
strapi.io = io;
// send to all users connected
strapi.emitToAllUsers = (order) => {
io.emit('new_order', order);
};
};
API控制器。/API/blabla/controllers/blabla.js仅由REST API调用。为了确保管理面板在任何情况下都能工作,ContentManager插件使用它自己的功能。如果您想将so应用于RESTAPI和管理面板,则必须自定义生命周期函数。但是由于在这个线程中会发现一些问题,所以灵活性会降低
来源:Strapi您必须从模型中的生命周期对象而不是从控制器执行此操作,控制器仅检查api层,模型检查数据库/Strapi层
module.exports={
生命周期:{
afterCreate:async(结果、数据)=>{
//从strapi admin创建注册表后
strapi.emitToAllUsers(结果);
}
}
}