Результат добавления двух чисел в Javascript неверен на Apache, но не на сервере ремесленников - PullRequest
0 голосов
/ 29 апреля 2019

Я обнаружил странное поведение сайта, который я разрабатываю.Он разрабатывается с использованием Laravel 5.8 и использует предустановку React для построения всего внешнего интерфейса.В этом проекте есть раздел статистики, и в некоторых из них вам нужно показать поле total.Когда я использую php artisan serve для запуска своего проекта и доступа к статистике, результаты отображаются и рассчитываются правильно.Проблема возникает, когда я развертываю этот сайт на Apache, используя AMPPS.Когда я делаю это, общая сумма вычисляется как строка, поэтому, например, если у меня есть сумма 1+0, вместо того, чтобы получить 1, я получаю 10.Он объединяет целые числа как строки.

Это результат, когда я использую php artisan serve imagephp artisan serve">

И этот, когда я использую apache:And this one when I use apache

Это мой код клиента:

constructor(props) {
    super(props);
    this.statsRoute = 'attendants/classification';
    this.state = {
        barData: {
            labels: [],
            datasets: [
                {
                    backgroundColor: [],
                    borderWidth: 1,
                    hoverBackgroundColor: [],
                    data: []
                }
            ],
            options: {
                scales: {
                    yAxes: [{
                        ticks: {
                            beginAtZero: true
                        }
                    }]
                },
                legend: {
                    display: false,
                }
            },
            tableRepresentation: {
                header: ['Clasificación', 'Número de Asistentes'],
                rows: []
            }
        },
        // Pie chart data
        pieData: {
            labels: [],
            datasets: [
                {
                    backgroundColor: [],
                    borderWidth: 1,
                    hoverBackgroundColor: [],
                    data: [],
                    total: 0
                }
            ],
            options: {
                legend: {
                    display: true,
                    position: 'bottom',
                },
                tooltips: {
                    callbacks: {
                        label: function (tooltipItem, data) {
                            let dataset = data.datasets[tooltipItem.datasetIndex];
                            let currentValue = dataset.data[tooltipItem.index].toFixed(2);
                            let label = data.labels[tooltipItem.index];
                            return ` ${label}: ${currentValue}%`;
                        }
                    }
                }
            },
            tableRepresentation: {
                header: ['Clasificación', 'Porcentaje'],
                rows: []
            }
        }
    }
}

componentWillMount() {
    this.props.statService.getStats(this.statsRoute)
        .then(res => {
            let total = 0;
            let barData = this.state.barData;
            let pieData = this.state.pieData;
            let colors = this.props.randomColorService.getArrayOfColors(res.length);

            for ( let i = 0; i < res.length; i++ ) {
                let item = res[i];

                total += item.count;
                barData.tableRepresentation.rows.push([
                    item.classification,
                    item.count
                ]);

                barData.labels.push(item.classification);
                barData.datasets[0].data.push(item.count);
                pieData.datasets[0].data.push(item.count * 100);
            }

            // Assign labels and colors to pie chart
            pieData.labels = barData.labels;
            barData.datasets[0].backgroundColor = colors['withAlfa'];
            barData.datasets[0].hoverBackgroundColor = colors['withoutAlfa'];

            // Assign colors to bar chart
            pieData.datasets[0].backgroundColor = colors['withAlfa'];
            pieData.datasets[0].hoverBackgroundColor = colors['withoutAlfa'];

            for ( let i = 0; i < pieData.datasets[0].data.length; i++ ) {
                pieData.datasets[0].data[i] /= total;
                let value = pieData.datasets[0].data[i];
                pieData.tableRepresentation.rows.push([
                    pieData.labels[i],
                    `${value.toFixed(2)}%`
                ]);
            }

            barData.tableRepresentation.rows.push([
                "",
                `Total: ${total}`
            ]);

            this.setState({
                barData: barData,
                pieData: pieData
            });
        })
        .catch(err => {
            console.log(err);
        });
}

И я сомневаюсь, что это проблема бэкэнда, потому что когда я делаю запрос, я получаюJSON вот так:

{
    "data": [
        {
            "item": "Invitado",
            "count": 6
        },
        {
            "item": "Asistente",
            "count": 7
        }
    ]
}

Итак, бэкэнд не составляет общую сумму, я делаю это на клиенте.

Почему это происходит только тогда, когда я использую apache в качестве сервера?

1 Ответ

0 голосов
/ 29 апреля 2019

Попробуйте заменить total += item.count; на total += +item.count;.

+ явно преобразует его в int, сейчас для версии apache числа обрабатываются как строки и объединяются, а не добавляются.

...