Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use socket.io in express routes?

Tags:

I'm using Express with Socket.io but I can't figure out how to use SocKet.io in Express routes.

I end up doing this in "app.js"

... ...  // development only if ('development' == app.get('env')) {   app.use(express.errorHandler());  }  var server = http.createServer(app); var io = require("socket.io").listen(server);   app.get('/', routes.index); app.get('/users', user.list); app.post('/cmp', function(request, response) {     var client = new pg.Client("pg://user:[email protected]/db_name");     client.connect(function(err) {        // Get the product_id and bid       var product_id = request.body.product_id;       var bid = request.body.bid.split('b')[1];                 // If not get the connection       if(err) {         return console.error('could not connect to postgres', err);       }         client.query('select 1 from product_bid where product_id = $1 and number_bid = $2', [product_id, bid], function(err, result) {         if(err) {           return console.error('error running query', err);         }          if (result.rowCount == 1) {           // do not insert                    } else {           // insert           // Insert to the DB           client.query('insert into product_bid (product_id, number_bid) values ($1, $2)', [product_id, bid], function(err, result) {             if(err) {               return console.error('error running query', err);             }              io.sockets.emit("bidSuccess", {product_id: product_id, bid: bid});             response.json(200, {message: "Message received!"});                      client.end();                       });         }        });     }); });   server.listen(app.get('port'), function(){   console.log('Express server listening on port ' + app.get('port')); });    // --------------- io.on('connection', function(socket){     console.log("alguem se ligou!");     socket.emit('event_from_server', {message: 'conectou-se ao servidor'}); }); 

How can I define the route to "/cmp" like this and passing the var "io" inside?

app.post('/cmp', routes.cmp); 

So that in "/routes/cmp.js" I can do something like this:

exports.cmp = function(req, res){     var product_id = req.body.product_id;     var bid = req.body.bid.split('b')[1];             io.sockets.emit("bidSuccess", {product_id: product_id, bid: bid});     response.json(200, {message: "Message received!"});     }; 

Some clues?

like image 214
André Avatar asked Jan 03 '14 17:01

André


People also ask

Can you use Socket.IO with Express?

Socket.IO can be used based on the Express server just as easily as it can run on a standard Node HTTP server. In this section, we will fire the Express server and ensure that it can talk to the client side via Socket.IO.

How do I connect to a Socket.IO server?

listen(port); // Create a Socket.IO instance, passing it our server var socket = io. listen(server); // Add a connect listener socket. on('connection', function(client){ console. log('Connection to client established'); // Success!


1 Answers

How about a higher order function?

exports.cmp = function(io) {   return function(req, res){     var product_id = req.body.product_id;     var bid = req.body.bid.split('b')[1];             io.sockets.emit("bidSuccess", {product_id: product_id, bid: bid});     response.json(200, {message: "Message received!"});       } }; 

and then

app.post('/cmp', routes.cmp(io)); 

As another option, I'll sometimes format my routes in the following format:

var routes = require('./routes/routes');  routes(app, io); 

And then define routes as

module.exports = function(app, io) {   app.post('/cmp', function(req, res){     var product_id = req.body.product_id;     var bid = req.body.bid.split('b')[1];             io.sockets.emit("bidSuccess", {product_id: product_id, bid: bid});     response.json(200, {message: "Message received!"});       }) }; 
like image 95
Michelle Tilley Avatar answered Sep 28 '22 05:09

Michelle Tilley