es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo hacer que socket.io funcione con los módulos de importación ES6?

Reorganicé un ejemplo simple de socket.io de la sintaxis CommonJS require a la sintaxis ES6 import, pero cuando inicio el servidor y voy al sitio web, aunque muestra el texto HTML (“test from server.js”), no informa al servidor que está conectado.

Sin embargo, no hay ningún error en la consola en absoluto, simplemente actúa como si socket.io no se está cargando en absoluto.

En mi archivo package.json, tengo la siguiente entrada para que los módulos de ES6 funcionen en Node:

"type": "module",

¿Por qué no está funcionando socket.io?

server.js

import path from 'path';
import http from 'http';
import express from 'express';
import { Server as socketIO } from 'socket.io';

const app = express();
const PORT = 5011;
const __dirname = path.resolve(path.dirname(''));
const server = http.Server(app);
const io = new socketIO(server);

app.get('/', (req, res) => {
    res.sendFile(__dirname + '/public/index.html');
});

io.on('connection', (socket) => {
    console.log('user connected');
    socket.emit('greeting-from-server', {
        greeting: 'you loaded the page'
    });
})

app.listen(PORT, () => {
    console.log(`listening on port http://localhost:${PORT}`);
});

/public/index.html




    
    
    
    Socket.IO
    
    



    test from server.js



Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una posible razón por la cual socket.io no esté funcionando después de refactorizar a la sintaxis import de ES6 es que el script del lado del cliente en /public/index.html puede que no esté importando correctamente el espacio de nombres io del módulo socket.io-client. Para solucionar esto, intenta actualizar la etiqueta del script de la siguiente manera:

    <script type="module">
      import { io } from "/socket.io/socket.io.js";
      const socket = io("http://localhost:5011");
      // ... el resto del código permanece igual
    </script>
    

    Esto importará correctamente el espacio de nombres io de socket.io-client como un módulo, permitiendo que funcione con la sintaxis ES6 utilizada en el resto del código base.

Comments are closed.