сокет, передать событие на сервер с сервера

У меня настроен сервер, а клиентские события сервера работают отлично, а сервер -> клиентские события также работают.

Однако, когда я пишу в свою БД, я хочу передать событие server-> server (или server-> self), чтобы я мог обрабатывать события асинхронного сервера (запись и чтение в БД). Или я ошибаюсь, полагая, что это возможно в среде 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 (насколько я могу судить) – это надежный серверный обработчик событий server-> client-> server, и на самом деле это отлично. Однако я искал некоторые события в самом приложении. Я нашел то, что был здесь, в документации 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 является удивительным для взаимодействия server-> client-> server. Встроенный обработчик событий, созданный в узле, отлично подходит для внутренних событий.