Ошибка ссылки: клиент не определен Socket.io

#javascript #html #node.js #socket.io #socket.io-java-client

Вопрос:

Как это решить? Я не понимаю, пожалуйста,помогите, спасибо. И это сообщение об ошибке, когда я запускаю узел server.js:

client.on(‘getRelay’, функция (состояние) { Ошибка ссылки: клиент не определен

 var express = require ('express');
var app = require('express')();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var port = 3000;

let bodyRelay = {
    relayId: 'RELAY-123',
    state: 1
}

app.use(express.static(__dirname   '/node_modules'));
app.get('/', function(req, res, next) {
    res.sendFile(__dirname   '/index.html');
});

io.on('connection', function(client) {
    console.log('a user has connected');

});

io.sockets.emit('setRelay', bodyRelay);
client.on('getRelay', function (state) {
    bodyRelay = state;
    console.log('id: '   client.id   'bodyRelay: '   JSON.stringify(bodyRelay));
    // io.sockets.emit('setRelay', bodyRelay);
});

client.on('disconnect', function() {
    console.log('a user has disconnected');
});

server.listen(port, () => {
    console.log('Server is running on port: '   port)
}); 

Комментарии:

1. Это говорит о том, что клиент нигде не был создан. Это весь код для этого файла?

Ответ №1:

Блоки кода , на которые ссылается ссылка client , должны находиться внутри этого обратного вызова:

 io.on('connection', function(client) {
    console.log('a user has connected');

});
 

потому что это то, что client определено. Подобный этому:

 io.on('connection', function(client) {
    console.log('a user has connected');

    client.on('getRelay', function (state) {
        bodyRelay = state;
        console.log('id: '   client.id   'bodyRelay: '   JSON.stringify(bodyRelay));
        // io.sockets.emit('setRelay', bodyRelay);
    });

    client.on('disconnect', function() {
        console.log('a user has disconnected');
    });
});
 

Еще несколько примечаний к вашему коду.

Место, где у вас есть это:

 io.sockets.emit('setRelay', bodyRelay);
 

это не имеет никакого смысла, потому что вы вызываете его при инициализации модуля, у которого НИКОГДА не будет подключенного сокета.клиенты ввода-вывода, так что это не принесет ничего полезного.

И то, как вы используете bodyRelay переменную, похоже на возможную ошибку проектирования. Вы сделали его переменной уровня модуля, что означает, что он является общим для всех обработчиков запросов для всех подключений. Если только это не предназначено для того, чтобы все клиенты могли изменять и все клиенты получали доступ к одному и тому же набору данных, тогда, возможно, потребуется другой дизайн. Я не знаю, что вы на самом деле пытаетесь с этим сделать, чтобы знать, какой дизайн предложить.