如何通过自定义控制器为在 Strapi 中创建新记录添加副作用?
How to add side effect to creating new record in Strapi by customizing controller?
我试图在 Strapi 中添加新记录时触发副作用(发送通知,使用 socket.io)。套接字设置正常,成功从后端 (Strapi API) 发射到前端。
我关注了 docs on customizing controllers and the recommendations in this ,但没有帮助。更改控制器时没有任何反应 - 试图通过仅用 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);
};
};
API 控制器 ./api/blabla/controllers/Blabla.js 仅由您的 REST API 调用。为了确保管理面板在任何情况下都能正常工作,内容管理器插件使用了它自己的功能。如果你想将这些东西应用到 REST API 和管理面板,你将不得不自定义生命周期函数。但是由于您可以在此线程中找到一些问题,您的灵活性会降低 https://github.com/strapi/strapi/issues/1443
来源:Strapi
你必须从模型中的生命周期对象而不是控制器来做,控制器只检查 api 层,模型检查 database/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);
}
}
}
我试图在 Strapi 中添加新记录时触发副作用(发送通知,使用 socket.io)。套接字设置正常,成功从后端 (Strapi API) 发射到前端。
我关注了 docs on customizing controllers and the recommendations in this 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);
};
};
API 控制器 ./api/blabla/controllers/Blabla.js 仅由您的 REST API 调用。为了确保管理面板在任何情况下都能正常工作,内容管理器插件使用了它自己的功能。如果你想将这些东西应用到 REST API 和管理面板,你将不得不自定义生命周期函数。但是由于您可以在此线程中找到一些问题,您的灵活性会降低 https://github.com/strapi/strapi/issues/1443
来源:Strapi
你必须从模型中的生命周期对象而不是控制器来做,控制器只检查 api 层,模型检查 database/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);
}
}
}