Я использую SocketIO в приложении чата React и Node. Идея состоит в том, что я интегрируюсь с Whatsapp, Telegram и другими сторонними приложениями чата с моим приложением.
Проблема в самом IO сокета. Я могу получать сообщения в клиентском приложении от telegram. Я отправляю новое сообщение. Я запускаю событие с именем new_message
, из которого я обрабатываю сообщение, отправляю его в Smooch для его пересылки [и я получаю сообщение в Telegram], но после обработки сообщения я запускаю точно такое же событие. срабатывает, когда я получаю новое сообщение от телеграммы, но по какой-то причине оно успешно срабатывает в новом полученном сообщении, но не когда я отправляю сообщение из своего приложения и отправляю событие после этого.
Вот мой код React
componentDidMount = async () => {
await this.getConversation();
await this.getMessages();
await this.initSocket();
}
initSocket = async () => {
let socket = await IO.subscribe(async message => { // this is a component that listens to 'http://localhost:4000' and for an event called '${app.id_new_message}'
console.log(message); // this log works if message came from telegram but not if i sent a message and emitted the same event
await this.setState(prev => ({
messages: {
...prev.messages,
docs: [
...prev.messages.docs,
message
]
}
}))
});
}
А вот и инициализация сокета на сервере + слушатель отправляющего сообщения
io.use((socket, next) => {
try {
if (socket.handshake.query && socket.handshake.query.token) {
let token = jwt.verify(socket.handshake.query.token, process.env.JWT_SECRET);
socket.decoded = token;
next();
} else {
next(new Error('Authentication Error'))
}
} catch (e) {
console.log(e);
}
}).on('connection', socket => {
global.socket = socket;
socket.on('new_message', message => {
sendMessage({content: message.content, conversation: message.conversation, socket: socket}) // this function calls the smooch endpoint to forward the message + stores the message in my db then fires an event called `${app.id}_new_message` which should be listened back by the client
})
})
Вот функция sendMessage
module.exports = async payload => {
try {
let send = await smooch.appUsers.sendMessage(payload.conversation.senderId, {
type: "text",
text: payload.content,
role: "appMaker"
})
let storeMessage = await new Model.Message({role: "appMaker", type: "text", received: moment().unix(), content: payload.content, conversation: payload.conversation.id}).save()
let getAppId = await Model.Conversation.findOne({_id: payload.conversation.id}).populate("channel");
payload.socket.emit(`${getAppId.channel.app}_new_message`, storeMessage);
} catch (e) {
console.log(e);
return e;
}
}
В новомПолученное сообщение, все, что я делаю, это просто использую экземпляр сокета global.socket
и выполняю следующие действия: \
socket.emit(`${data.app._id}_new_message`, message);
Чего здесь не хватает в моем коде?