我正在从客户端向服务器端发出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");