
Alexis Alberto Texis Auza
PreguntaHola,estoy implementando socket.io,pero me gustaria saber si es una buena idea implemetarlo asi ?
Lo que hago es que una vez que creo un registro,consulto los registros(GET) para ver los datos actualizados y posteriormente enviarlos como una emision al cliente
SERVER
index
import express from 'express' import bodyParser from 'body-parser' import axios from 'axios' import socketIO from 'socket.io' import { createServer } from 'http' import apiItems from './routes/index' const app = express() const server = createServer(app) //rutas app.use('/new',apiItems) //socket const io = new socketIO(server) //guardo como atributo la instancia del socket para poder usarla en las rutas app.set('io',io) //server init const port = process.env.PORT || 8000 server.listen(port, => console.log(`server on https://localhost:${port}`))
routes
import { Router } from 'express' // como ejemplo estoy consumiendo un api que ya cree con anterioridad Router.post('/',async (req,res,next) => { let item let items const { app,body } = req const io = app.get('io') try { item = await axios.post('my_url',body) items = await axios.get('my_url') } catch(e) { next(e) } io.emit('items_updates',{ data : badges.data.payload}) //emito los datos actualizados res.status(200).json({ user: badge.data }) } export default Router
CLIENT
import React,{ useEffect,useState } from 'react'; import io from 'socket.io-client' import './App.css' function App() { const [users,setUsers] = useState([]) let socket const initSocket = () => { socket = io('http://localhost:8000') socket.on('items_updates',(data) => { let users_update = users.concat(data.data) setUsers([...users_update]) }) } const getUsers = async () => { let users try { let response = await fetch('http://localhost:8000/badges') users = await response.json() setUsers([...users,...badges.data.payload]) } catch(e) { console.log(e.message) } } const handleCreate = async () => { let user const input = { key : "value", ... } try { let response = await fetch('http://localhost:8000/new',{ method : 'POST', headers : new Headers({'Content-Type' : 'application/json'}), body : JSON.stringify(input) }) user= await response.json() console.log(user) } catch(e) { console.log(e.message) } } useEffect(() => { getBadges() initSocket() },[]) return ( <div className="App"> <h3>Ejemplo socket</h3> <button onClick={handleCreate}>crear</button> <div className="container"> { users && users.map( user => <h3>{user.name}</h3>) } </div> </div> );

Alexis Alberto Texis Auza
Ok entiendo,entonces en lugar de hacer el get lo que podria hacer ,es una vez que se guarda el registro, emitir en el socket el input del cliente y una vez que le llege actualizar(agregarlo) mi estado(array).

Diego Forero
En teoría no deberías hacer un get adicional, la idea de usar sockets es que cuando se actualiza la información el socket haga push de la información a todos los clientes conectados.