Node.js 速递 |尝试获取 JSON 时始终为 null
Posted
技术标签:
【中文标题】Node.js 速递 |尝试获取 JSON 时始终为 null【英文标题】:Node.js Express | Always getting null when trying to get a JSON 【发布时间】:2013-11-18 06:33:49 【问题描述】:我对 node.js 非常陌生,我想在 html5 网站上接收来自 PostgreSQL 数据库的 JSON。因此,在服务器端,我使用 node-postgres 模块进行数据库连接,并使用 express 模块进行通信。 PostgreSQL 查询返回一个 JSON 对象。
服务器端:
var express = require('express');
var app = express();
app.get('/data', function(req, res)
var pg = require('pg');
var conString = "postgres://postgres:postgres2@localhost/spots";
var client = new pg.Client(conString);
client.connect(function(err)
if(err)
res.send('could not connect to postgres');
client.query('SELECT * from spots_json where id=3276', function(err, result)
if(err)
res.send('error running query');
res.send(JSON.stringify(result.rows[0].json));
client.end();
);
);
);
app.listen(3000);
客户端:
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.js" ></script>
<script>
$.get('http://localhost:3000/data',, function(data)
alert(JSON.parse(data));
,"json");
</script>
</head>
<body>
<div id="map-canvas"></div>
</body>
</html>
如果我在浏览器上导航到http://localhost:3000/data
,我会得到:
\"type\":\"Point\",\"coordinates\":[-2.994783,43.389217]
所以我看到服务器正在正确发送字符串化的 JSON,但在客户端我总是得到空数据。我一定有什么误解。
【问题讨论】:
听起来你在对它进行双重编码。 客户端中data
的值是多少?
我认为数据是已回答的数据。几周前我开始编程时,我不太了解代码..应该怎么做?
看我的回答。 “data”已经被$.get
解析过了,所以它已经是一个JSON对象了,不用再尝试解析了,直接开始使用吧
【参考方案1】:
好的,这就是我的代码到目前为止的样子,对于任何可以提供帮助的人:
服务器端
var express = require('express');
var app = express();
app.get('/data', function(req, res)
var pg = require('pg');
var conString = "postgres://postgres:postgres2@localhost/spots";
var client = new pg.Client(conString);
client.connect(function(err)
if(err)
res.send('could not connect to postgres');
client.query('SELECT * from spots_json where id=3276', function(err, result)
if(err)
res.send('error running query');
res.set("Content-Type", 'text/javascript'); // i added this to avoid the "Resource interpreted as Script but transferred with MIME type text/html" message
res.send(JSON.stringify(result.rows[0].json));
client.end();
);
);
);
app.listen(3000);
客户端
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"></meta>
<meta charset="utf-8"></meta>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.js" ></script>
<script>
$.get('http://localhost:3000/data?callback=?',, function(data)
alert(data.type);
,"json");
</script>
</head>
<body>
<div id="map-canvas"></div>
</body>
</html>
客户端现在在http://localhost:8888/prueba/prueba.html
上执行
我得到一个带有以下响应的 js:
"\"type\":\"Point\",\"坐标\":[-2.994783,43.389217]"
响应可以在以下屏幕截图中看到:
https://www.dropbox.com/s/zi4c5pqnbctf548/pantallazo.png
但是现在警报甚至没有显示...
我想我需要一些亮光。
【讨论】:
【参考方案2】:获取时数据已经是一个对象,而不是字符串。所以JSON.parse
失败了,因为你在它期待一个字符串时给了它一个对象。要验证,请更改
alert(JSON.parse(data));
到
alert(data.type);
你应该得到“点”
您已经拥有一个对象的原因是因为您提供给$.get
的"json"
参数。如果您将其更改为 "html"
,您将得到一个字符串,然后您可以将其解析为 JSON 对象。
【讨论】:
感谢您的解释 chiliNUT。我明白。但我尝试了两种方法,我仍然得到空数据...... 我在 Chrome 的 javascript 控制台中收到以下错误:XMLHttpRequest cannot load localhost:3000/data。 Access-Control-Allow-Origin 不允许 Origin null。 prueba.html:1 Uncaught TypeError: Cannot read property '0' of null 嗯。可能是它以某种方式违反了相同的域策略。 html 文件和 node.js 文件都在 localhost 上吗? 是的,两者都有。我正在阅读可能会向 url 添加回调有效 $.get('localhost:3000/data?jsoncallback=?',, function(data) alert(data.type); ,"json");但现在我得到:资源解释为脚本,但使用 MIME 类型 text/html 传输:“localhost:3000/…”。我不知道我是否会前进...... 我不知道如何帮助你。我认为您应该不接受我的回答,看看其他人是否可以给您更好的答案,或者您应该发布另一个问题【参考方案3】:我认为当您将结果放入响应对象时,您不应该尝试将其字符串化。
只要把它完全说出来,它就会自动这样:
res.set("Content-Type", 'application/json');
res.json(result.rows[0].json);
这是通过 REST API 发送信息的正确方式。
然后在您的客户端代码中,我不知道它是如何工作的,但它应该本机接受 json。
【讨论】:
以上是关于Node.js 速递 |尝试获取 JSON 时始终为 null的主要内容,如果未能解决你的问题,请参考以下文章
使用Node.JS和SQL Server始终加密插入数据库时 出错
如何使用 Node.js 将 JSON 数据从 Node.js 发送和获取到 HTML
在 ES6 Node.js 中导入“.json”扩展会引发错误
从 atomicassets (wax.atomichub.io) 获取数据时,使用 discord.js 的 Node.js GET 错误