簡體   English   中英

連接 SOCKET.IO

[英]CONNECTION SOCKET.IO

我已經被 socket.io 問題困擾了幾天,更准確地說是在服務器到客戶端之間。 在客戶端,(Angular)我可以發出一個事件,服務器可以抓取並執行所有邏輯,但是在服務器到客戶端之后它沒有顯示生命跡象。 我已經表達了所有事件,我已經按照文檔中的說明重新制定了所有設置,但沒有任何效果,誰能看到我哪里出錯了?

“socket.io”:“^4.5.1”

"socket.io-client": "^4.5.1",

ANGULAR(客戶端)

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { io, Socket } from 'socket.io-client';
import { environment } from 'src/environments/environment';


@Injectable({
  providedIn: 'root'
})
export class SocketIoService {

  socket: Socket;

  constructor() {}

  connect(token: string, userName: string){
    this.socket = io(environment.path.hermsUrl, {
      query: {
       token,
       userName
      }
    });
  }

  disconnect(){
    this.socket.disconnect();
  }

  sendMessage(msg: any) {
    this.socket.emit('send-message', (msg));
  }

  getConversation(){
    this.socket.on('update-conversation', (conversation)=> {
      console.log('############################################');
    });
  }


}

NODE.JS(服務器端)

require('dotenv').config();
require('./Helpers/init_mongodb');
const express = require('express');
const cors = require('cors');
const createError = require('http-errors');
const chatController = require('./Controllers/chat.controller');
const Chat = require('./Models/chat.model');
const app = express();
const httServer = require('http').createServer(app);
const { verifyAccessToken } = require('./Helpers/jwt_token');
const userRoute = require('./Routes/user.routes');
const eventRoute = require('./Routes/event.routes');
const chatRoute = require('./Routes/chat.routes');
const decode = require('jwt-decode');
const PORT = process.env.PORT || 5005;

const io = require('socket.io')(httServer, {
  cors: {
    origins: ["*"]
  }
});

app.use(express.json({ limit: '50mb' }));
app.use(express.urlencoded({ extended: true }));
app.use(cors());
app.use('/path/user', userRoute);
app.use('/path/event', eventRoute);
app.use('/path/chat', chatRoute);

app.use(async (req, res, next) => {
  next(createError.NotFound('THIS ROUTE DOES NOT EXIST'))
});

app.get('/', verifyAccessToken, async (req, res, next) => {
  res.send('HELLO THERE')
});


app.use((err, req, res, next) => {
    res.status(err.status || 500)
    res.send({
      error: {
        status: err.status || 500,
        message: err.message,
      },
    })
});


io.on("connection", (socket) => {
  
  const decodedObj = decode(socket.handshake.query.token);
  socket.id = decodedObj.aud;
  const userName = socket.handshake.query.userName;

  console.log("========= SOCKET.IO CONNECTED =========");
  console.log("");
  console.log("USERNAME: " + userName);
  console.log("ID: " + socket.id);
  console.log("");
  console.log("=======================================");


  socket.on('send-message', async (message) => {

    try{

        const chatId = message.chatId;
        const decodedObj = decode(message.sender);
        const senderId = decodedObj.ID;
        const userSocketId = message.userId;

        const date = new Date();
        const day = date.getDate();
        const month = date.getMonth();
        const year = date.getFullYear();
        const hour = date.getHours();
        const minuts = date.getMinutes();

        const sendingDate = day + "/" + month + "/" + year + " " + hour + ":" + minuts;

        const newMsg = {
          msgType: message.typeOfMsg,
          message: message.msg,
          date: sendingDate,
          sender: senderId
        }

        const conversation = await Chat.findById(chatId);

        if(!conversation){
          throw createError.NotFound();
        }

        conversation.messages.push(newMsg);

        const updateConversation = await Chat.findByIdAndUpdate(chatId, conversation);

        if(!updateConversation){
          throw createError.InternalServerError();
        }

        console.log("!!!!!!!!!!! SEND EMIT FROM SOCKET/SERVER !!!!!!!!!!!!!!!");
        io.emit('update-conversation', 'FROM SERVER');
        io.emit('update-conversation');
        io.local.emit('update-conversation');
        io.local.emit('update-conversation', 'FROM SERVER');
        socket.emit('update-conversation', 'FROM SERVER');
        socket.emit('update-conversation');
        socket.broadcast('update-conversation', 'FROM SERVER');
        console.log("!!!!!!!!!!! EMIT SENDED !!!!!!!!!!!!!!!");

        
      } catch (error) {
        console.log(error);
      }
  });



  socket.on("disconnect", () => {
    console.log("########### SOCKET.IO DISCONNECTED ###########");
    console.log("");
    console.log("USERNAME: " + userName);
    console.log("ID: " + socket.id);
    console.log("");
    console.log("##############################################");
  });

});


httServer.listen(PORT, () => {
    console.log(`SERVER RUNNING ON PORT ${PORT}`);
})

您似乎尚未在客戶端中收聽update-conversation消息。 因此,當服務器發送它時,您沒有任何客戶端代碼來實際接收它。

首次創建 socket.io 連接時,您需要在客戶端注冊監聽this.socket.on('update-conversation', ...) 然后,只要服務器發送該消息,它將准備好接收該消息。

暫無
暫無

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

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