Tengo el siguiente código (servidor):
import express from "express"; import socketio from "socket.io"; import http from "http"; const app = express(); const server = http.createServer(app); const io = socketio(server); server.listen(process.env.port || 3000, () => { console.log(`App running on port ${process.env.port || 3000}`); }); Pero me sale un error en const io = socketio(server); , Afirma:
Esta expresión no es invocable. Escriba 'typeof import("SOME_PATH/node_modules/socket.io/dist/index")' no tiene firmas de llamada
¿Cuál es exactamente el problema aquí?
paquete.json:
"devDependencies": { "@types/express": "^4.17.11", "@types/node": "^14.14.27", "@types/socket.io": "^2.1.13", "nodemon": "^2.0.7", "ts-node": "^9.1.1" }, "dependencies": { "express": "^4.17.1", "socket.io": "^3.1.1", "typescript": "^4.1.5" }La API cambió en la versión 3. Este problema aquí tiene cierta discusión.
El nuevo equivalente de su ejemplo sería
import express from "express"; import { Server } from "socket.io"; import http from "http"; const app = express(); const server = http.createServer(app); const io = new Server(server); server.listen(process.env.port || 3000, () => { console.log(`App running on port ${process.env.port || 3000}`); });Como nota al margen, socket.io se reescribió en mecanografiado, por lo que ya no necesita tener @types/socket.io.
No estoy seguro de eso, pero el problema parece estar en la forma en que socket.io describe su propia exportación predeterminada.
Resolví esto emitiéndolo como cualquier
import io from 'socket.io'; const server = (io as any)(http);