Сервер Node.js не отправляет ответ, или клиент не получает - PullRequest
0 голосов
/ 08 июля 2019

Я делаю ajax-запрос со стороны клиента на сторону сервера.Затем с сервера я делаю еще один запрос ajax к api по питанию, чтобы получить информацию об определенных продуктах.Я делаю это таким образом, чтобы мой ключ API не находился в общедоступном коде JavaScript на стороне клиента.Похоже, что запрос от клиента отправляется, а затем получает мой сервер.Затем сервер делает запрос к API и получает правильный ответ.Однако ответ теряется между сервером и клиентом.

Я пытался печатать на консоль в различных местах тестирования.Я попытался использовать res.write (объект) и res.end (объект)

, вот мой сервер node.js:

http.createServer(function(req, res) {
    var q = url.parse(req.url, true).query;
    console.log("q.newIngredient: " + q.newIngredient);
    var apireq = new XMLHttpRequest();
    apireq.open('GET', 'https://api.nutritionix.com/v1_1/search/' + q.newIngredient + '?results=0:1&fields=item_name,nf_serving_size_qty,nf_serving_size_unit,nf_calories,nf_total_fat,nf_colesterol,nf_sodium,nf_total_carbohydrate,nf_sugars,nf_protein&appId=' + apiid + '&appKey=' + apikey, true);
    apireq.addEventListener("load", function() {
        if(apireq.status >= 200 && apireq.status <= 400) {
            console.log("respond test");
            res.writeHead(200, {"Content-Type": "application/json"});
            console.log("type: " + typeof(apireq.responseText));
            console.log(JSON.parse(apireq.responseText));
            res.end(apireq.responseText);
            console.log("respond test 2");
        }
        else {
            console.log("Error in network request: " + req.statusText);
        }
    });
    apireq.send(null);
    //event.preventDefault();
}).listen(3001);

, а вот мой ajax-запрос на стороне клиента

    req.open("GET", "http://localhost:3001/?newIngredient=" + newIngredient, true);
    req.addEventListener('load', function() {
        if(req.status >= 200 && req.status < 400) {
                console.log("respond test 3");
                var response = JSON.parse(req.responseText);
                console.log(response);
                console.log(response.hits[0].fields.item_name);
                var nfacts = response.hits[0].fields;
                console.log(nfacts);
            }
        else {
        console.log("Error in network request: " + req.statusText);
        }
    });

    req.send(null);
    event.preventDefault();
    });
}

сообщение «test test 3» не выводится на консоль.Однако печатаются другие тестовые сообщения с ответами, и печатается правильный ответ от API.

Спасибо!

Редактировать: Я обнаружил, что это проблема CORS.В консоли инструментов разработчика браузера появляется сообщение об ошибке:

Доступ к XMLHttpRequest по адресу http://localhost:3001/?newIngredient=ham' от источника http://localhost:3000' заблокирован политикой CORS: Нет доступаЗаголовок -Control-Allow-Origin 'присутствует на запрашиваемом ресурсе.

Я добавил эту строку кода, и она заработала: res.setHeader("Access-Control-Allow-Origin", "http://localhost:3000");

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