2014-10-31 195 views
1

我有一个服务器设置和客户端 - >服务器事件工作很好,服务器 - >客户端事件也工作。但是,当我写入我的数据库时,我想发出一个服务器 - >服务器(或服务器 - >自我)事件,以便我可以处理异步服务器事件(写入和读取数据库)。或者我错误地认为这是可能的在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

我知道在我的逻辑的失误在这一点上。

Socket.io是(据我所知)一个强大的服务器 - >客户端 - >服务器事件处理程序,真的很棒。不过,我正在寻找处理应用程序本身内的一些事件。我在NodeJs的文档中发现我是here

更改代码:我补充说:

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非常适合服务器端 - >客户端 - >服务器交互。内置的事件处理程序非常适合内部事件。

相关问题