Javascript 如何通过自定义控制器在Strapi中创建新记录时添加副作用?

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

我试图在Strapi中添加新记录时触发一个副作用(使用socket.io发送通知)。套接字设置正常,成功地从后端(Strapi API)发送到前端。 我遵循了关于定制控制器的说明和本文中的建议,但没有提供帮助。更改控制器时不会发生任何情况-尝试通过将
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(结果);
}
}
}