2

我对 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,但在客户端我总是得到空数据。我一定有什么误解。

4

3 回答 3

2

好的,这就是我的代码到目前为止的样子,对于任何可以提供帮助的人:

服务器端

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:

"{\"类型\":\"点\",\"坐标\":[-2.994783,43.389217]}"

响应可以在以下屏幕截图中看到:

https://www.dropbox.com/s/zi4c5pqnbctf548/pantallazo.png

但是现在甚至没有显示警报...

我想我需要对此有所了解。

于 2013-11-07T20:10:35.780 回答
1

当你得到它时,数据已经是一个对象,而不是一个字符串。所以JSON.parse失败了,因为你在它期待一个字符串时给了它一个对象。要验证,更改

alert(JSON.parse(data));

alert(data.type);

你应该得到“点”

您已经拥有一个对象的原因是"json"您提供给$.get. 如果将其更改为,"html"您将得到一个字符串,然后您可以将其解析为 JSON 对象。

于 2013-11-06T20:31:13.773 回答
0

我认为当您将结果放入响应对象时,您不应该尝试将其字符串化。只要把它完全说出来,它就会自动这样: res.set("Content-Type", 'application/json'); res.json(result.rows[0].json);

这是通过 REST API 发送信息的正确方式。

然后在您的客户端代码中,我不知道它是如何工作的,但它应该本机接受 json。

于 2016-05-19T08:56:59.997 回答