簡體   English   中英

如何通過自定義控制器在 Strapi 中創建新記錄添加副作用?

[英]How to add side effect to creating new record in Strapi by customizing controller?

在 Strapi 中添加新記錄時,我試圖觸發副作用(發送通知,使用 socket.io)。 套接字設置正常,成功從后端(Strapi API)發射到前端。 我遵循了有關自定義控制器的文檔以及此Stack Overflow 線程中的建議,但沒有幫助。 更改控制器時沒有任何反應 - 試圖通過將create函數體替換為return null;來破壞它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 調用。 為了確保管理面板在任何情況下都能正常工作,內容管理器插件使用它自己的功能。 如果您想將這些東西同時應用於 REST API 和管理面板,則必須自定義生命周期函數。 但是由於您可以在此線程https://github.com/strapi/strapi/issues/1443 中找到的某些問題,您的靈活性會降低

資料來源:斯特拉皮

你必須從模型中的生命周期對象而不是控制器來做,控制器只檢查 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); } } }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM