套接字,从服务器发送事件到服务器

我有一个服务器设置和客户端 – >服务器事件工作很好,服务器 – >客户端事件也工作。

但是,当我正在写我的数据库我想发出一个服务器 – >服务器(或服务器 – >自我)事件,所以我可以处理asynchronous服务器事件(写入和读取到数据库)。 或者我错误地认为这是可能的在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(据我所知)是一个强大的服务器 – >客户端 – >服务器事件处理程序,真是太棒了。 不过,我正在寻找处理应用程序本身的一些事件。 我在NodeJs的文档中find了我所在的地方 。

更改的代码:我补充说:

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

然后,我在服务器中为内部事件创build了一个新的部分,它有:

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

哪个工作很好。

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