socket, emit event to server from server

2019-02-26 06:25发布

I have a server set up and client -> server events work great, server -> client events also work.

However, as I am writing to my DB I want to emit a server->server (or server->self) event so I can handle async server events (writing and reading to a DB). Or am I wrong in assuming this is possible in the Socket.io environment?

Socket Code:

io.on('connection', function(socket){
  socket.emit('uuid', {id: uuid.v1()});

  socket.on('add touchEvents', function (data) {
    if (typeof data !== 'object') return false;

    var conn = mysql.createConnection(connectionInfo);
    var checkExistsQuery = "SELECT COUNT(id) AS rows FROM `tbl_heatmap` WHERE UUID='"+data.uuid+"'";
    conn.query(checkExistsQuery, function (err, rows) {
      if (err) { return false; }


      if (rows[0].rows === 0) {
        console.log('gonna emit');
        socket.emit('internal event', {'data': true})
        return;
      }

      console.log('external event');
    });

    conn.end();
  });

  socket.on('internal event', function (data) {
    console.log('internal')
  });

});

Full Server:

"use strict";

/***
 *
 *                     _
 *     ___ ___ ___ _ _|_|___ ___ ___
 *    |  _| -_| . | | | |  _| -_|_ -|
 *    |_| |___|_  |___|_|_| |___|___|
 *              |_|
 */
var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Prmoise = require('bluebird');
var path = require('path');
var winston = require("winston");
var mysql = require("mysql");
var cookieParser = require('cookie-parser')
var uuid = require('uuid');

/***
 *
 *                                        _   _
 *     ___ ___ ___ _ _ ___ ___    ___ ___| |_|_|___ ___ ___
 *    |_ -| -_|  _| | | -_|  _|  | . | . |  _| | . |   |_ -|
 *    |___|___|_|  \_/|___|_|    |___|  _|_| |_|___|_|_|___|
 *                                   |_|
 */
var port = 3100;
var assetsDir = {root: path.join(__dirname, 'app/assets')};
var pubDir = {root: path.join(__dirname, 'public/')};
var logsDir = path.join(__dirname, 'logs/');

/***
 *
 *                       _    _     ___
 *     _____ _ _ ___ ___| |  |_|___|  _|___
 *    |     | | |_ -| . | |  | |   |  _| . |
 *    |_|_|_|_  |___|_  |_|  |_|_|_|_| |___|
 *          |___|     |_|
 */
var connectionInfo = {
  'host'     : 'localhost',
  'user'     : 'root',
  'password' : '',
  'database' : 'heatmap'
};

/***
 *
 *     _             _
 *    | |___ ___ ___|_|___ ___
 *    | | . | . | . | |   | . |
 *    |_|___|_  |_  |_|_|_|_  |
 *          |___|___|     |___|
 */
 var logger = new (winston.Logger)({
   transports: [
   new (winston.transports.Console)({ level: 'error', colors: true }),
   new (winston.transports.File)({ filename: logsDir + 'server.log', level: 'debug' })
   ]
 });

 /***
  *
  *           _   _   _ _
  *     _____|_|_| |_| | |___ _ _ _ ___ ___ ___
  *    |     | | . | . | | -_| | | | .'|  _| -_|
  *    |_|_|_|_|___|___|_|___|_____|__,|_| |___|
  *
  */
app.use('/assets', express.static(__dirname + '/app/assets'));
app.use(cookieParser());

/***
 *
 *                 _
 *     ___ ___ _ _| |_ ___ ___
 *    |  _| . | | |  _| -_|  _|
 *    |_| |___|___|_| |___|_|
 *
 */
app.get("/", function(req, res) {
  res.sendFile("index.html", pubDir);
});

app.get("/logs/view", function (req, res) {
  res.set('Content-Type', 'application/json');

  var options = {
      from: new Date - 24 * 60 * 60 * 1000,
      until: new Date,
      limit: 10,
      start: 0,
      order: 'desc',
      fields: ['message']
    };

    //
    // Find items logged between today and yesterday.
    //
    winston.query(options, function (err, results) {
      if (err) {
        throw err;
      }

      res.send(results);
    });
});

/***
 *
 *     _____ _____ _____ _____ _____ _____ _____
 *    |   __|   __|_   _|_   _|   __| __  |   __|
 *    |  |  |   __| | |   | | |   __|    -|__   |
 *    |_____|_____| |_|   |_| |_____|__|__|_____|
 *
 */

/***
 *
 *     _____ _____ _____ _____ _____ _____   _
 *    |   __|     |     |  |  |   __|_   _| |_|___
 *    |__   |  |  |   --|    -|   __| | |  _| | . |
 *    |_____|_____|_____|__|__|_____| |_| |_|_|___|
 *
 */
io.on('connection', function(socket){
  socket.emit('uuid', {id: uuid.v1()});

  socket.on('add touchEvents', function (data) {
    if (typeof data !== 'object') return false;

    var conn = mysql.createConnection(connectionInfo);
    var checkExistsQuery = "SELECT COUNT(id) AS rows FROM `tbl_heatmap` WHERE UUID='"+data.uuid+"'";
    conn.query(checkExistsQuery, function (err, rows) {
      if (err) { return false; }


      if (rows[0].rows === 0) {
        console.log('gonna emit');
        socket.emit('internal event', {'data': true})
        return;
      }

      console.log('update?');
    });

    conn.end();
  });

  socket.on('internal event', function (data) {console.log('internal event')});

});

 /***
  *
  *         _           _
  *     ___| |_ ___ ___| |_    ___ ___ ___ _ _ ___ ___
  *    |_ -|  _| .'|  _|  _|  |_ -| -_|  _| | | -_|  _|
  *    |___|_| |__,|_| |_|    |___|___|_|  \_/|___|_|
  *
  */
http.listen(port, function () {
  console.log('I am listening on '+port);
});

1条回答
劫难
2楼-- · 2019-02-26 06:49

I understand where my logical misstep was at this point.

Socket.io is (as far as I can tell) a robust server->client->server event handler, and is really great at that. However I was looking to handle some events within the app itself. I found what I was here in NodeJs' documentation.

Changed code: I added:

var EventEmitter = require("events").EventEmitter;
var ee = new EventEmitter();

and within my socket event I have:

if (rows[0].rows === 0) {
    console.log('gonna emit');
    ee.emit('internal event', {'data': true})
    return;
  }

I then created a new section in my server for internal events, and that has:

ee.on("internal event", function (data) {
  console.log(data)
});

Which is working great.

TL;DR: Socket.io is awesome for server->client->server interactions. Node's built in event handler is great for internal events.

查看更多
登录 后发表回答