2014-01-03 3 views
20

Я использую Express с Socket.io, но я не могу понять, как использовать SocKet.io в Express-маршрутах.Как использовать socket.io в экспресс-маршрутах?

я в конечном итоге делает это в «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'}); 
}); 

Как я могу определить маршрут к «/ КСС», как это и проходя УАК «ю» внутри?

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

Так что в "/routes/cmp.js" Я могу сделать что-то вроде этого:

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!"});  
}; 

Некоторые подсказки?

+1

Лучшим решение здесь: http://stackoverflow.com/questions/37559610/socket-io-emit-on-express- route/37560779 # 37560779 – mdv

ответ

45

Как насчет функции более высокого порядка?

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!"});  
    } 
}; 

, а затем

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

В качестве другого варианта, я иногда форматировать маршруты в следующем формате:

var routes = require('./routes/routes'); 

routes(app, io); 

а затем определить routes, как

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!"});  
    }) 
}; 
+0

Идея функции высшего порядка была отличной, спасибо. –

+0

Моя 2-дневная борьба окончательно подошла к концу. Спасибо – Sudhakar

+0

Ответ на этот вопрос я ищу. – Antoine

2

Вы можете использовать простые промежуточное программное обеспечение перед теми маршрутами, а затем использовать в разрешении объекта

app.use((req, res, next) => { 
    res.io = io 
    next() 
}) 
+0

Есть ли недостатки в этом? Для меня это похоже на лучшую ставку/решение и требует минимального рефакторинга – babycakes

Смежные вопросы