Как использовать socket.io в express-маршрутах?

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

В итоге я делаю это в “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'}); }); 

Как я могу определить маршрут к «/ cmp», как это, и передать var «io» внутри?

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

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

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

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

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

 app.use((req, res, next) => { res.io = io next() }) 
  • Разница в номерах Socket.io между broadcast.to и socket.in
  • socket.io и выразить 4 сеанса
  • Какую библиотеку websocket использовать с Node.js?
  • Node.js - Как удалить порт из URL-адреса?
  • Socket.IO - как мне получить список подключенных сокетов / клиентов?
  • Как повторно использовать соединение redis в socket.io?
  • Различия между socket.io и websockets
  • Отправка сообщения на определенный идентификатор в Socket.IO 1.0
  • socket.io комнаты или namespacing?
  • личное сообщение socket.io
  • Обработать перезагрузку браузера socket.io
  • Давайте будем гением компьютера.