【发布时间】: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