node.js - 套接字,从服务器向服务器发出事件

标签 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);
});

最佳答案

我明白此时我的逻辑失误在哪里。

Socket.io(据我所知)是一个强大的服务器->客户端->服务器事件处理程序,并且在这方面非常出色。不过,我希望处理应用程序本身内的一些事件。我发现我是什么here在 NodeJs 的文档中。

更改了代码:我添加了:

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

在我的套接字事件中,我有:

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 的内置事件处理程序非常适合内部事件。

关于node.js - 套接字,从服务器向服务器发出事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26667378/

相关文章:

javascript - Node.js 中未计算 CRC32 校验和

node.js - '无法读取未定义的属性 'length'' nodeJS

node.js - 在 Express 服务的多个 React 客户端内进行路由

c++ - sendto 和 recvfrom 在同一个程序中?

c# - 从 C# 客户端向 Java 服务器发送 4 字节消息头

javascript - 并行运行 Node 和 Apache

c# - socket.io-client 足以作为 XSockets.NET 服务器的套接字客户端吗?

node.js - 声明同名变量会导致套接字 io 出现问题

javascript - Socket.io - 监听器必须是 socket.io 事件上的函数

Node.js + socket.io 返回事件数据