【问题标题】:How to add side effect to creating new record in Strapi by customizing controller?如何通过自定义控制器添加副作用以在 Strapi 中创建新记录?
【发布时间】:2019-12-17 14:25:21
【问题描述】:

在 Strapi 中添加新记录时,我试图触发副作用(使用 socket.io 发送通知)。套接字设置正常,成功从后端(Strapi API)发射到前端。 我遵循了docs 自定义控制器和此Stack Overflow thread 中的建议,但没有帮助。更改控制器时没有任何反应 - 试图通过仅用 return null; 或 console.log() 替换 create 函数体来破坏它,但仍然没有。这是../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);   
  }; 
};

【问题讨论】:

    标签: javascript node.js socket.io strapi


    【解决方案1】:

    API 控制器 ./api/blabla/controllers/Blabla.js 仅由您的 REST API 调用。为确保管理面板在任何情况下都能正常工作,内容管理器插件使用它自己的功能。如果你想将这些东西应用到 REST API 和管理面板,你将不得不自定义生命周期函数。但是由于您可以在此线程https://github.com/strapi/strapi/issues/1443 中找到一些问题,因此您的灵活性会降低

    来源:Strapi

    【讨论】:

      【解决方案2】:

      您必须从模型中的生命周期对象而不是控制器中执行此操作,控制器仅检查 api 层,模型检查数据库/strapi 层

      https://strapi.io/documentation/v3.x/concepts/models.html#concept

      module.exports = {
          lifecycles: {
              afterCreate: async (result, data) => {
                  // after create registry from strapi admin
                  strapi.emitToAllUsers(result);
              }
        }
      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-09
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 1970-01-01
        相关资源
        最近更新 更多