Как правильно отправить 2 параметра в socket.io с помощью lambdas? (Я получаю неопределенный при печати на клиенте и сервере) - PullRequest
0 голосов
/ 24 января 2019

Я новичок в sockets.io и пытаюсь отправить 2 значения при использовании socket.on().Моя проблема в том, что я не получаю никаких ошибок при отправке 2 значений с клиента на сервер.Я попытался напечатать значения, однако я получил неопределенный по обоим параметрам ( как на клиенте, так и на сервере ).Я хотел бы знать, как правильно отправить 2 значения из клиент-сервер (socket.on()) и обратно в сервер-клиент (socket.emit()), поскольку я не получаю никаких ошибок.

ПРИМЕЧАНИЕ: все отлично работает, если в сокетах используется только 1 значение!

Мой index.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>socket.io - chart.js example</title>
  <script type="text/javascript "src="/socket.io/socket.io.js"></script>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.0/Chart.bundle.min.js"></script>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
</head>
<body>
    <h1>Analisis de Sentimientos</h1>
    <form>
        Ingresar Nombre del Lugar: 
        <input id="lugar" type="text" name="Lugar"><br>
        <input type="submit" value="Analizar" onclick="recivir()">
    </form>
    <canvas id="chart"></canvas>
    <canvas id="chart2"></canvas>

    <script type="text/javascript">

    var lugar = "";
    function recivir(){
        lugar = document.getElementById("lugar").value;
    }

    var socket = io.connect();
    var ctx = document.getElementById('chart').getContext('2d')
    var data = {
        labels: [''],
            datasets: [{
            data: [0],
            label: 'POSITIVO',
            backgroundColor: 'rgb(0,0,170,0.8)',
            render: 'percentage'
        }]
    }

    var options = {
            plugins: {
                labels: {
                    render: 'label',
                    }
                },
                showActualPercentages: true,
            }


    var chart = new Chart(ctx, {
        type: 'bar',
        data: data,
        options: options
    })

    chart.canvas.parentNode.style.width = '30%';

    socket.on('temperature', function (value, lugar) {
        var length = data.labels.length

        if (length >= 5) {
            data.datasets[0].data.shift()
            data.labels.shift()
        }

        data.labels.push('');
        data.datasets[0].data.push(value)


        chart.update()
    })

    var socket2 = io.connect();
    var ctx2 = document.getElementById('chart2').getContext('2d')
    var data2 = {
        labels: [''],
            datasets: [{
            data: [0],
            label: 'NEGATIVO',
            backgroundColor: 'rgb(170,0,0,0.8)',
            render: 'percentage'
        }]
    }

    var options2 = {
            plugins: {
                labels: {
                    render: 'label',
                    }
                },
                showActualPercentages: true,
            }


    var chart2 = new Chart(ctx2, {
        type: 'bar',
        data: data2,
        options: options2
    })

    chart2.canvas.parentNode.style.width = '30%';

    socket2.on('temperature', function (value, lugar) {
        var length = data2.labels.length

        if (length >= 5) {
            data2.datasets[0].data.shift()
            data2.labels.shift()
        }

        data2.labels.push('');
        data2.datasets[0].data.push(value)

        chart2.update();

        if(((data.datasets[0].data[1] == data.datasets[0].data[2]) && (data.datasets[0].data[2] == data.datasets[0].data[3])) 
        && ((data.datasets[0].data[1] > 0) && (data.datasets[0].data[2] > 0) && (data.datasets[0].data[3] > 0)) 
        && ((data2.datasets[0].data[1] == data2.datasets[0].data[2]) && (data2.datasets[0].data[2] == data2.datasets[0].data[3])) 
        && ((data2.datasets[0].data[1] > 0) && (data2.datasets[0].data[2] > 0) && (data2.datasets[0].data[3] > 0))){
            socket.close();
            socket2.close();
        }       
    })
  </script>
</body>
</html>

Мой server.js:

'use strict'

const http = require('http')
const path = require('path')
const EventEmitter = require('events')
const express = require('express')
const socketio = require('socket.io')
const port = process.env.PORT || 8888

const app = express()
const server = http.createServer(app)
const io = socketio(server)
const events = new EventEmitter()
let x = 0;

app.use(express.static(path.join(__dirname, 'public')))

io.on('connect', socket => {
  events.on('temperature', ({value, lugar}) => {
    console.log(value); //this equals undefined
    console.log(lugar); //this equals undefined
    socket.emit('temperature', {value,lugar})
  })
})

// This function will be changed for the J5 sensor event
// sensor.on('change', function () {
//   events.emit('temperature', this.celsius)
// })
//
setInterval(() => {

    if(x < 30){
        x++;
    }

    const temperature = x;

    events.emit('temperature', {temperature,x});
}, 1000)

server.listen(port, () => console.log(`Listening on port ${port}`))

1 Ответ

0 голосов
/ 24 января 2019

Вы отправляете {temperature, x}, что является сокращением для {temperature: temperature, x: x}.

Однако с другой стороны вы ожидаете объект, содержащий ключи value и lugar.Они явно не определены, поэтому он регистрирует undefined.

Кроме того, на стороне клиента ваши слушатели ожидают 2 параметра (function(value, lugar)) вместо одного объекта (function({value, lugar})), поэтому вам нужнорефакторинг их также.

Если это работает с одним значением, я предполагаю, что у вас не было этого значения, инкапсулированного в объекте, следовательно, имеется прямая связь между переданным значением и именем параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...