Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

socket.io Typescript fails to create a server, "This expression is not callable"

I have the following code(server):

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}`);
});

But i get an error on const io = socketio(server);, It states:

This expression is not callable. Type 'typeof import("SOME_PATH/node_modules/socket.io/dist/index")' has no call signatures

What exactly is the problem here?

package.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"
  }
like image 281
TheNormalPerson Avatar asked Feb 13 '21 14:02

TheNormalPerson


People also ask

Is const Io = socketio(server) callable?

But i get an error on const io = socketio (server);, It states: This expression is not callable. Type 'typeof import ("SOME_PATH/node_modules/socket.io/dist/index")' has no call signatures

What happened to socket Io?

As a side note, socket.io was rewritten in typescript, so you no longer need to have @types/socket.io. Not sure about that, but the problem seems to be in the way socket.io describe its own default export.

Can you build a WebSocket based server with typescript?

Welcome friends! In this tutorial, we are going to be looking at how you can build a websocket based server using both TypeScript and Socket.io. WebSockets are an awesome technology and I absolutely love playing around with them and creating real-time applications.

Is 'typeof import(some_path/node_modules/socket)' callable?

This expression is not callable. Type 'typeof import ("SOME_PATH/node_modules/socket.io/dist/index")' has no call signatures What exactly is the problem here?


2 Answers

The api changed in version 3. This issue here has some discussion.

The new equivalent of your example would be

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}`);
});

As a side note, socket.io was rewritten in typescript, so you no longer need to have @types/socket.io.

like image 92
Brian Avatar answered Oct 25 '22 07:10

Brian


Not sure about that, but the problem seems to be in the way socket.io describe its own default export.

I solved this by casting it as any

    import io from 'socket.io';
    const server = (io as any)(http);
like image 1
E.K Avatar answered Oct 25 '22 07:10

E.K