【发布时间】:2015-12-31 16:23:11
【问题描述】:
在我当前的项目中,我正在尝试访问传感器数据并将其绘制到 Web 浏览器。以下代码(在 node.js 中)随机生成温度值,其他代码定期轮询服务并将其绘制到 Web 浏览器。我的问题是,当我运行此代码时.. 我的浏览器没有绘制任何内容,并且我在控制台中收到以下消息。您能告诉我这段代码有什么问题吗?
未声明 HTML 文档的字符编码。这 在某些浏览器配置中,文档将呈现乱码 如果文档包含 US-ASCII 范围之外的字符。 页面的字符编码必须在文档中声明或 在传输协议中。
跨域请求被阻止:同源策略不允许读取 http://localhost:8686/temperature 的远程资源。 (原因: CORS 标头“Access-Control-Allow-Origin”缺失)。
var http = require("http");
var port = 8686;
function randomInt (low, high) {
return Math.floor(Math.random() * (high - low) + low);
}
http.createServer(function(req,res){
console.log('New incoming client request for ' + req.url);
res.writeHeader(200, {'Content-Type': 'application/json'});
switch(req.url) {
case '/temperature':
// And return the corresponding JSON
res.write('{"value" :' + randomInt(1, 40) + '}');
break;
}
res.end();
}).listen(8686);
console.log('Server listening on http://localhost:' + port);
以下是使用 URL 定期轮询 node.js 代码的客户端代码:'http://localhost:8686/temperature'。我正在使用 Google 可视化库来随机绘制温度。
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script type="text/javascript"
src="https://www.google.com/jsapi?autoload={
'modules':[{
'name':'visualization',
'version':'1',
'packages':['corechart']
}]
}">
</script>
</head>
<body>
<div id="chart" style="width: 900px; height: 500px"></div>
<script type="text/javascript">
$(document).ready(function () {
var maxDataPoints = 10;
var chart = new google.visualization.LineChart($('#chart')[0]);
var data = google.visualization.arrayToDataTable([
['Time', 'Temperature'],
[getTime(), 0]
]);
var options = {
title: 'Temperature',
curveType: 'function',
animation: {
duration: 1000,
easing: 'in'
},
legend: {position: 'bottom'}
};
function addDataPoint(dataPoint) {
if (data.getNumberOfRows() > maxDataPoints) {
data.removeRow(0);
}
data.addRow([getTime(), dataPoint.value]);
chart.draw(data, options);
}
function getTime() {
var d = new Date();
return d.toLocaleTimeString();
}
function doPoll() {
$.getJSON('http://localhost:8686/temperature',
function (result) {
console.log(result);
addDataPoint(result);
setTimeout(doPoll, 2000);
});
}
doPoll();
});
【问题讨论】:
-
谷歌关于“同源政策”和CORS
-
FE 代码没问题,通过在 FE 中生成随机数进行测试,在
doPoll(codepen.io/anon/pen/ojZEQm) 中。因此,正如@slebetman 所说,这一定是数据访问问题。并且您应该看到“XMLHttpRequest 无法加载...。请求的资源上不存在 'Access-Control-Allow-Origin' 标头...”。确保您没有在控制台上应用任何可能隐藏错误的过滤器。关于 CORS 的最佳文章是 -developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS。简而言之 - 如果 FE (html) 也从 localhost:8686 提供,它应该可以工作。 -
此外,请检查“网络”选项卡是否有错误,而不仅仅是控制台。
-
感谢 slebetman 和 tiblu 的回复!我对网络开发有点陌生。你能告诉我 - 我该如何解决这个问题?我正在使用 Mozilla firefox 进行测试。
-
我现在附上错误和问题供您参考。
标签: javascript node.js