Node.js 将Sockets.io与React.js+;钩子;sockets.emit不工作

Node.js 将Sockets.io与React.js+;钩子;sockets.emit不工作,node.js,reactjs,sockets,react-hooks,Node.js,Reactjs,Sockets,React Hooks,我完全不知道为什么这不起作用,我对在react中使用钩子还不熟悉,但是我想尝试一下 此应用程序基本上使用sockets.io将sockets.io连接到服务器。服务器每1s发出一次时间您必须将套接字实例存储在ref中,否则在组件重新渲染时会丢失连接的套接字实例 简而言之,您需要套接字引用在渲染中保持相同 const socketUrl = 'http://localhost:3001'; let socket = useRef(null); useEffect(() => {

我完全不知道为什么这不起作用,我对在react中使用钩子还不熟悉,但是我想尝试一下


此应用程序基本上使用sockets.io将sockets.io连接到服务器。服务器每1s发出一次时间您必须将套接字实例存储在ref中,否则在组件重新渲染时会丢失连接的套接字实例

简而言之,您需要套接字引用在渲染中保持相同

  const socketUrl = 'http://localhost:3001';
  let socket = useRef(null);

  useEffect(() => {
      socket.current = io(socketUrl, {
           autoConnect: false,
      });
      ...
  }, [socketUrl]);
现在请注意,无论您在哪里使用
socket
,您都将使用
socket.current

例:


很高兴能帮忙:-)
const http = require('http');
const cors = require('cors');
const express = require('express');

const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const io = require('socket.io')();
const socketAuth = require('socketio-auth');


//custom modules
const router = require('./modules/router');
const db = require('./modules/db.js');
const prettyDate = require('./modules/prettyDate.js');
const sortArray = require('./modules/sortArray.js');

const app = express();
const server = http.createServer(app);

io.attach(server);

app.use(cors()); ///delete for production
app.use(bodyParser.urlencoded({ extended: true }));
app.use(fileUpload({
    createParentPath: true
}));
app.use(bodyParser.json());
app.use(cookieParser());
app.use(router);
app.use(express.static('public'))

db.i12345.sessions.persistence.setAutocompactionInterval(400)

 ////Sessions Store; not important if you want to run the code without
function setUser(id,user,i){
console.log('setuser')
let institution = i
  db[institution].sessions.find({ user:user }, function (err, docs) {
 if(docs.length){
  db[institution].sessions.update({user:user  }, { $set: { id: id } }, { multi: true }, function (err, numReplaced) {

  });


 } else {
  var d = new Date();
  var n = d.getTime();
  var doc = { user: user
               , id: id
               , t:n

               };

    db[institution].sessions.insert(doc, function (err, newDoc) {  

      });
 }



});
}




///user verification; could easily mock; if wanting to actually run code
async function verifyUser (token,i) {
    var institution =i
  return new Promise((resolve, reject) => {
    // setTimeout to mock a cache or database call
    setTimeout(() => {

      var user = new Promise((resolve,reject) =>{
        db[institution].users.find({email:token}, function (err, docs) {
            if(docs.length){

                resolve(docs);
             } else {
             reject(false)
             }

              });
    });


      if (!user) {
        return reject('USER_NOT_FOUND');
      }

      return resolve(user);
    }, 200);
  });
}



//// Sockets auth implementation
socketAuth(io, {

  authenticate: async (socket, data, callback) => {
    const { token, i } = data;
    console.log(data)

    try {
      const user = await verifyUser(token, i);




      socket.user = user;
      socket.i = i
      console.log(i)

      return callback(null, true);
    } catch (e) {
      console.log(`Socket ${socket.id} unauthorized.`);
      return callback({ message: 'UNAUTHORIZED' });
    }
  },
  postAuthenticate: async (socket) => {
    console.log(`Socket ${socket.id} authenticated.`);
    console.log(socket.user)
    setUser(socket.id,socket.user, socket.i)

    socket.emit('empty list', {queryList:true});

    io.emit('admin connected', {admin:true});

    socket.conn.on('packet', async (packet) => {
      if (socket.auth && packet.type === 'ping') {
      }
    });
    socket.on('chatmessage', (msg) => {
      io.emit('chatmessage', msg);
      console.log(msg);
    });
    socket.on('hello', (msg) => {
        io.emit('chatmessage', msg);
        console.log(msg);
      });

    socket.on('get tasks', (get) => {
     let i = socket.i
     let user = socket.user
     getTasksChunk(get,i,user)

      });

      socket.on('admin userlist', (get) => {
        let i = socket.i
        let user = socket.user

        adminGetUserList(get,i,user)


         });

         socket.on('admin roles', (data) => {
            let i = socket.i
            let user = socket.user
                console.log(data)
                console.log('reaced')



             });




    interval = setInterval(() => getApiAndEmit(socket), 1000);

  },



  disconnect: async (socket) => {
    console.log(`Socket ${socket.id} disconnected.`);

    if (socket.user) {

    }
  },
})

function getTasksChunk(get,i, user){
    console.log(get,i,user);
    let institution = i

        db[institution].tasks24.find({}, async function (err, docs) {
            if(docs.length){
                for(i=0;i<docs.length;i++){
                    docs[i].location = `Ward: ${docs[i].location.Ward} Bed: ${docs[i].location.Bed}`
                    docs[i].patient = docs[i].patient.join(' | ')
                    docs[i].timestamp = prettyDate(new Date(+docs[i].timestamp))
                  } 
                  console.log(docs)
                let sorted = await sortArray(docs,'timestamp')
                let chunk = sorted.slice(0,10)

               io.emit('tasks in', chunk);
             } else {

             }

              });





}

const getApiAndEmit = socket => {
    const response = new Date();
    // Emitting a new message. Will be consumed by the client
    socket.emit("FromAPI", response);
  };


  ///////ADMIN????????

 function adminGetUserList(get,i,user){
     var institution = i
     console.log('hello')
    db[institution].users.find({}, async function (err, docs) {
        if(docs.length){

              console.log(docs)
            let sorted = await sortArray(docs,'timestamp')


           io.emit('admin user list', sorted);
         } else {

         }

          });
  }
server.listen(process.env.PORT || 3001, () => console.log(`Server has started.`));
  const socketUrl = 'http://localhost:3001';
  let socket = useRef(null);

  useEffect(() => {
      socket.current = io(socketUrl, {
           autoConnect: false,
      });
      ...
  }, [socketUrl]);
 socket,.current.on('hello', (msg) => {
    io.emit('chatmessage', msg);
    console.log(msg);
  });