一尘不染

如何在快速路由中使用socket.io?

node.js

我在Socket.io中使用Express,但我不知道如何在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:pass@127.0.0.1/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!"});    
};

一些线索?


阅读 265

收藏
2020-07-07

共1个答案

一尘不染

高阶函数呢?

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