XMLHttpRequest ответ null

Привет, я новичок в веб-разработке. У меня есть три файла: index.html, myscript.js и server.js. Кнопка в index.html вызывает функцию messageServer в myscript.js, которая отправляет XMLHttpRequest на server.js, выполняющий Express на Node. Сервер получает запрос, но ответ в myscript.js всегда равен нулю. Готовое состояние идет 1, а затем 4. Почему оно равно нулю? Заранее спасибо Обновлено: код состояния ответа - 0
index.html:

<!DOCTYPE html>
<html>
    <head>
        <title id = "title">Page Title</title>
        <script src = "myscript.js"></script>
    </head>
    <body>
        <h1 id = "header">Header</h1>
        <form>
            <input type = "button" value = "Message Server" onclick = "messageServer();">
        </form>
    </body>
</html>

myscript.js

function messageServer() {
    const xhr = new XMLHttpRequest();
    const url = 'http://localhost:8888/';

    xhr.responseType = 'json';
    xhr.onreadystatechange = () => {

        log("Ready state: " + xhr.readyState + ", response: " + xhr.response);

        if (xhr.readyState === XMLHttpRequest.DONE) {
            return xhr.response;
        }
    };

    xhr.open('GET', url);
    xhr.send();
}

и server.js

const express = require('express');
const app = express();

const port = 8888;

let requestCount = 1;

app.get('/', (req, res, next) => {
    console.info('Received get request ' + requestCount);
    ++requestCount;
    res.send(JSON.stringify({myKey: 'myValue'}));
});

app.listen(port);

вы устанавливаете тип ответа как json, почему вы затем отправляете его в строковой форме? поменять его на res.send({myKey: 'myValue'});

kiddorails 09.06.2018 22:33

@kiddorails Я получил эту ошибку: «TypeError: первый аргумент должен быть строкой или буфером», когда я это сделал

Ben Lamb 09.06.2018 22:35

измените его обратно на более старую версию и добавьте перед ней res.setHeader('Content-Type', 'application/json');.

kiddorails 09.06.2018 22:38

или res.json({myKey; 'myValue'}) тоже должно работать идеально

kiddorails 09.06.2018 22:39

Пробовал оба. По-прежнему ноль

Ben Lamb 09.06.2018 22:41

ОК. вместо проверки xhr.response попробуйте xhr.responseText

kiddorails 09.06.2018 22:43

и удалите xhr.responseType = 'json';, если он все еще не работает, и попробуйте снова

kiddorails 09.06.2018 22:44

и если все еще не работает, переместите xhr.responseType = 'json'; после xhr.open и попробуйте еще раз с xhr.response и xhr.responseText

kiddorails 09.06.2018 22:45

Хорошо, поэтому переместите responseType на after open: с responseText оба являются пустыми строками и с response, когда readyState равно 1, это пустая строка, а когда readyState равно 4, оно равно нулю.

Ben Lamb 09.06.2018 22:55

Я пробовал и другие вещи, не сработало

Ben Lamb 09.06.2018 22:56

Вы вообще получаете там 200 откликов? Можете просто подтвердить это с помощью console.info(xhr.status)?

kiddorails 09.06.2018 22:57
gist.github.com/AnkurGel/9af39c377bf3ce1f167f9abf4ebb7568 Этот пример отлично подходит для меня
kiddorails 09.06.2018 23:02

Код состояния был 0. Может быть, это потому, что я запускаю сервер и клиентский скрипт на одном компьютере?

Ben Lamb 09.06.2018 23:15

код состояния, не готов

kiddorails 09.06.2018 23:15

Я пробовал эту конечную точку API в вашем примере, и это сработало. Подождите, у него 400, так что это не сработало, но произошло что-то другое

Ben Lamb 09.06.2018 23:16

да код статуса 0

Ben Lamb 09.06.2018 23:16

измените журнал на console.info в myscript.js, также проверьте сообщения об ошибках на консоли.

Rajnikant 09.06.2018 23:42

Немного глупый вопрос, но как? Когда я нажимаю кнопку в браузере, она не связана с консолью, поэтому ничего не отображается. Даже если есть способ выполнить его независимо, сервер блокирует консоль, чтобы я не запускал какие-либо команды

Ben Lamb 09.06.2018 23:59

Возможный дубликат XMLHttpRequest status 0 (responseText пуст)

Heretic Monkey 10.06.2018 01:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
19
2 783
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основная проблема заключается в том, что CORS (совместное использование ресурсов между источниками) не включено в экспрессе, хром немного строги в отношении CORS.

поместите код ниже перед app.get, чтобы включить совместное использование ресурсов из разных источников

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

полный server.js должен быть таким, как показано ниже

var express = require("express");
var app = express();

const port = 8888;
let requestCount = 1;

app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
  });

app.get('/', (req, res, next) => {
    console.info('Received get request ' + requestCount);
    ++requestCount;
    res.send(JSON.stringify({myKey: 'myValue'}));
});

app.listen(port);

Затем проверьте вкладку сети в инструменте разработчика, вы должны увидеть ответ {"myKey":"myValue"}.

Да! Вот и все, спасибо. Небольшой вопрос: нормально ли добавлять это в приложения узла? Это потому, что я запускаю его локально или что

Ben Lamb 10.06.2018 00:15

это не только применимо к приложениям узла, в вашем примере это из-за XmlHttpRequest, вот полная ссылка developer.mozilla.org/en-US/docs/Web/HTTP/CORS, и какие запросы используют CORS? раздел должен объяснить это. даже в своем ответе я поставил «"это должен быть ваш домен /, так что для вашего примера локальный: 8888 *.

Rajnikant 10.06.2018 01:15

Другие вопросы по теме