У меня есть простое приложение Node.js, использующее липкую сессию, экспресс и socket.io. Я проверил файлы библиотеки Sticky-session, и он должен порождать нового воркера, как только один из других умирает, поэтому я протестировал, чтобы выйти из процесса на одном из воркеров. Но теперь вместо создания только нового воркера все мое приложение вылетает из строя и выдает мне эту ошибку:
emitting message: adad . socket.id=YcaiZWUFKlF12lD9AAAB . pid = 11448
emitting message: adadadad . socket.id=YcaiZWUFKlF12lD9AAAB . pid = 11448
events.js:182
throw er; // Unhandled 'error' event
^
Error [ERR_IPC_CHANNEL_CLOSED]: channel closed
at ChildProcess.target.send (internal/child_process.js:590:16)
at Worker.send (internal/cluster/worker.js:54:28)
at Server.<anonymous> (C:\Users\name\Desktop\socket.io + node cluster + redis WORKING\node_modules\sticky-session\lib\sticky-session.js:54:14)
at emitOne (events.js:115:13)
at Server.emit (events.js:210:7)
at TCP.onconnection (net.js:1554:8)
Вот мой серверный код
var express = require('express');
var http = require('http');
var sticky = require('sticky-session');
var expressHandler = require("./handlers/expressHandler")
var redisHandler = require("./handlers/redisHandler")
var ioSocketHandler = require("./handlers/socketHandler")
var config = require("./configuration/default")
var port = config.web.port;
var workers = config.system.cores
var app = express();
///////////////////////////////////
// HTTP SERVER
///////////////////////////////////
sticky(workers, function() {
var server = http.createServer(app);
var io = require('socket.io')(server);
redisHandler(io)
ioSocketHandler(io)
return server;
}).listen(port, function() {
console.info(`server started on port ${port}. process id = ${process.pid}`);
});
///////////////////////////////////
// EXPRESS
///////////////////////////////////
expressHandler(app)
И вот экспресс-модуль, который намеренно вызывает ошибку
var config = require("../configuration/default")
var cookieParser = require('cookie-parser');
var session = require("express-session")({
secret: config.cookie.secret,
resave: true,
saveUninitialized: true
})
function initialiseExpressHandlers(app) {
app.use(cookieParser());
session.Cookie
app.use(session);
app.get('/', function(req, res) {
console.info(req.session)
res.sendfile('index.html');
});
app.get('/kill', function(req, res) {
process.exit(1);
});
}
module.exports = initialiseExpressHandlers
И, наконец, Redis Adaptar, который я использую для обработки socket.io в кластере. Другой код не должен иметь значения.
var redis = require('redis');
var redisAdapter = require('socket.io-redis');
function initialiseRedisHandler(io) {
var redisUrl = process.env.REDISTOGO_URL || 'redis://127.0.0.1:6379';
var redisOptions = require('parse-redis-url')(redis).parse(redisUrl);
var pub = redis.createClient(redisOptions.port, redisOptions.host, {
detect_buffers: true,
auth_pass: redisOptions.password
});
var sub = redis.createClient(redisOptions.port, redisOptions.host, {
detect_buffers: true,
auth_pass: redisOptions.password
});
io.adapter(redisAdapter({
pubClient: pub,
subClient: sub
}));
console.info('Redis adapter started with url: ' + redisUrl);
}
module.exports = initialiseRedisHandler
Я использую v8.7.0
похоже, что много ошибок, связанных с этим, возникли недавно (т.е. в конце 2017 года), вы можете попробовать обновить свой узел до версии 9 +?
Я только что обновился до 9.9, но все равно выдает ошибку.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


какую версию Node вы используете?