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 始终获取 docker0 ip

使用Node.JS和SQL Server始终加密插入数据库时 出错

如何使用 Node.js 将 JSON 数据从 Node.js 发送和获取到 HTML

在 ES6 Node.js 中导入“.json”扩展会引发错误

从 atomicassets (wax.atomichub.io) 获取数据时,使用 discord.js 的 Node.js GET 错误

需要 JSON 时 Node.js 崩溃