Node.js服务器未发送响应,或客户端未接收到

时间:2019-07-08 07:00:35

标签: javascript node.js express server client

我正在从客户端向服务器端发出ajax请求。然后,我从服务器向营养api发出另一个ajax请求,以获取有关某些食物的信息。我这样做是为了让我的api密钥不在公共客户端javascript代码中。似乎来自客户端的请求已发送,然后被我的服务器接收。然后,服务器向api发出请求,并接收正确的响应。但是,服务器和客户端之间的响应丢失了。

我尝试在各个测试位置打印到控制台。我尝试使用res.write(object)和res.end(object)

这是我的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();
    });
}

“响应测试3”消息未打印到控制台。但是会打印其他响应测试消息,并打印来自api的正确响应。

谢谢!

编辑:我发现这是一个CORS问题。我在浏览器开发人员工具控制台中收到一条错误消息,提示:

CORS策略已阻止从来源“ http://localhost:3001/?newIngredient=ham”访问“ http://localhost:3000”处的XMLHttpRequest:请求的资源上没有“ Access-Control-Allow-Origin”标头。

我添加了这一行代码,它的工作原理是: res.setHeader("Access-Control-Allow-Origin", "http://localhost:3000");

0 个答案:

没有答案