2016-08-18 181 views
0

我试图找出为什么我的查询之一将不会从查询返回的值...我的代码看起来是这样的:JavaScript函数不返回查询结果

var client = new pg.Client(conString); 
client.connect(); 

var query = client.query("SELECT count(*) as count FROM sat_scores") 

// Don't use demo key in production. Get a key from https://api.nasa.gov/index.html#apply-for-an-api-key 

function getNEO(callback) { 
    var data = ''; 
    query.on('rows', function(rows) { 
     console.log("Row count is: %s", rows[0].count) 
     data += rows[0].count; 
    }); 
    query.on('end', function() { 
     callback(data); 
    }); 
} 

与, getNEO返回空白......但如果我设置var data = '4',然后getNEO返回4 ....查询将返回128,但它只是返回一个空白......

+0

好像'data'事件可能被触发? 'console.log'是否显示在您的控制台中? –

+0

@FelixKling,看起来像'query.on('data',...'没有被触发......将'data''改为''rows'',但这也不起作用。 – user2061886

+0

这就是为什么空值被传递的原因,现在你必须弄清楚如何实际获取数据。 –

回答

1

首先,getNEO()没有回报任何东西 - 我的操作假定你只需拨打getNEO()一次为query,一个nd通过回调来处理数据,而回调是没有得到适当的数据?

我对这样的事情排除故障典型的建议是简化代码,并试图让真正接近给定(for instance)任何示例代码:

var client = new pg.Client(conString); 
// define your callback here, in theory 
client.connect(function (err) { 
    if (err) throw err; 

    var query = client.query("SELECT count(*) as count FROM sat_scores"), 
     function(err, result) { 
      if (err) throw err; 

      console.log(result.rows.length); 
     } 
    ); 
}); 

...我做了几件事情在这里你要注意:

  1. 它看起来像client.connect()方法是异步的 - 你不能只是连接,然后再运行查询,你必须等待,直到连接完成,因此回调。仔细查看代码,它看起来好像在准备发送查询时可能会发出connect事件,因此您不必直接在connect()方法上使用回调。
  2. 我没有看到data事件in the documentation for the query object也没有看到代码中的一个。您可以使用row事件,或者您可以直接在查询中使用回调,就像在主页上的示例一样 - 这就是我为了简单起见而在这里所做的。
  3. 我没有看到你正在使用的count属性,而row[0]只是第一个结果 - 我想你想在整个rows数组上的length属性,如果你正在寻找返回的行数。

我不知道,如果你有一个很好的理由来使用,而不是直接将代码在程序上的getNEO()功能,但我认为你可以得到什么你这样以后更接近于:

var client = new pg.Client(conString); 
// define your callback here, in theory 
client.connect(); 

function getNEO(callback) { 
    client.on('connect', function() { 
     var query = client.query("SELECT count(*) as count FROM sat_scores")); 

     query.on('end', function(result) { 
      callback(result.rowCount); 
     }); 
    }); 
} 

...所以,你可以叫你getNEO()功能,只要你喜欢,它会适当地等待连接完成,那么你可以跳过跟踪的每一行,因为它涉及; end事件收到result对象,它会给你所有的行和行数与你想要的。

+1

docs表示最好使用客户端池:var pool = new pg.Pool(config); //运行查询我们可以从池中获取客户端 //在客户端上运行查询,然后将客户端返回到池 pool.connect(function(err,client,done){ – stackdave

+0

@ stackdave优秀的建议 - 一旦你获得了基本的工作代码,下一步就是理解用来进行第一级优化的适当的最佳实践,比如使用客户端池。 – Jason

-1

所以这里是我如何能够解决这个问题....我感动var query内部功能

function getNEO(state, callback) { 
    var conString = "postgres://alexa:[email protected]:5439/alexa"; 

    var client = new pg.Client(conString); 
    client.connect(); 
    var data = ''; 
    var query = client.query("SELECT avg(Math) as math, avg(Reading) as reading FROM sat_scores WHERE State = '" + state + "'"); 
    console.log("query is: %s", query); 
    query.on('row', function(row) { 
      console.log("Row cnt is: %s", row.math); 
      console.log("row is: " + row) 
      data += row; 
     }); 
    console.log("made it"); 
    query.on('end', function() { 
    callback(data); 
     }); 
    } 
+0

协议文档你必须经常做:var client = new pg.Client() ; //连接到我们的数据库 client.connect(function(err){if(err)throw err; ... – stackdave