我在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!"}); };
一些线索?
高阶函数呢?
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为
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!"}); }) };