socket,从服务器向服务器发出事件

时间:2014-10-31 04:06:23

标签: node.js sockets socket.io

我有一台服务器设置和客户端 - >服务器事件工作得很好,服务器 - >客户活动也有效。

但是,当我写入我的数据库时,我想发出一个服务器 - >服务器(或服务器 - >自身)事件,这样我就可以处理异步服务器事件(写入和读取数据库)。或者我认为在Socket.io环境中可以这样做是错误的吗?

套接字代码:

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')
  });

});

完整服务器:

"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 个答案:

答案 0 :(得分:2)

我明白我的逻辑错误在哪里。

Socket.io(据我所知)是一个强大的服务器 - >客户端 - >服务器事件处理程序,并且真的很棒。但是我想要在应用程序本身内处理一些事件。我在NodeJs的文档中找到了我here的内容。

更改了代码:我添加了:

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

在我的socket事件中我有:

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

然后我在服务器中为内部事件创建了一个新部分,其中包含:

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

哪个效果很好。

TL; DR: Socket.io对于服务器 - >客户端 - >服务器交互非常棒。 Node的内置事件处理程序非常适合内部事件。