DEV Community

Cover image for How to uncouples emit events from connection event into and express
Marcos Henrique
Marcos Henrique

Posted on • Updated on


How to uncouples emit events from connection event into and express

Preface ๐Ÿ‘“

I've worked in a project with node.js, express and websockets, In a part of the project I realized the need to uncouples the sending of messages to the websocket, since I would need to do this in a place where there was no instance of it, in my case it was on a specific route in the middle of the business rule logic.

I would need to send the return in real time of each stage of this processing, and among all the alternatives, such as passing the socket instance as a route by route parameter (in my project I have unification of the routes by prefix) and having to refactor a lot of the that I had already done, I found this way that I present to you ๐Ÿ“จ

Socket.IO is a JavaScript library for realtime web applications. It enables realtime, bi-directional communication between web clients and servers.

Socket.IO is NOT a WebSocket implementation.

Although Socket.IO indeed uses WebSocket as a transport when possible, it adds some metadata to each packet: the packet type, the namespace and the packet id when a message acknowledgement is needed.

That is why a WebSocket client will not be able to successfully connect to a Socket.IO server, and a Socket.IO client will not be able to connect to a WebSocket server either.

You can see more about here.

Socket Service Class โœจ

const socketIo = require('');

class SocketService {
   constructor(server) { = socketIo(server);'connection', socket => {
       console.log('user connected')

  emiter(event, body) {
    if(body), body);

module.exports = SocketService;

Enter fullscreen mode Exit fullscreen mode

Implementation in app.js ๐Ÿ‘พ

In the main of my application, there I was put the instance of Socket Service as a singleton into express app.

With that I was able to use it on other routes without having to modify anything on them

const express = require('express');
const app = express();
const server = require('http').Server(app);

app.use(`/`, require('./routes'));

server.listen(3001, function () {
  console.debug(`listening on port 3001`);

 app.set("socketService", new SocketService(server));
Enter fullscreen mode Exit fullscreen mode

Using in the route controller or anywhere you want ๐Ÿ›ฃ

//using req to access app that I had defined before"socketService").emiter('message', req.body);

//anywhere with access to app:
app.get("socketService").emiter('message', req.body);
Enter fullscreen mode Exit fullscreen mode

that's all, i hope this can help you in your projects!

Top comments (8)

thebrown profile image

Thank you so much, Finally I found the way to use Socket IO in the express route

wakeupmh profile image
Marcos Henrique • Edited

I'm happy to have helped ๐Ÿค˜

sharpex profile image

This is great i have searched for it for two days tried all stackoverflow solutions none was working....Thanks

duanegabriel profile image
Duane Gabriel

Brother, you're article in a few words solved my problem, thank you.
Cheers from Brazil.

mthew profile image

Heeey bro, thanks, your article is very helpfull

jawadch profile image

@wakeupmh can you please show us how to use this with client side

gantushig77 profile image

You solved my problem and saved my project. Thank you very much. I appreciate your work. Please keep doing your amazing work. ๐Ÿ‘๐Ÿ‘๐Ÿ‘

huynhquanhht profile image
Quan Huynh

Thanks. Your article is very helpful.