我试图找出为什么我的一个查询不会从查询返回值...我的代码看起来像这样:
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 :(得分:1)
首先,getNEO()
不会返回任何内容 - 我假设你只为getNEO()
拨打query
一次,并传入一个回调来处理数据,那回调就是得不到合适的数据?
我对此类问题进行故障排除的典型建议是简化代码,并尝试接近给定的任何示例代码(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);
}
);
});
......我在这里做了几件你想要注意的事情:
client.connect()
方法是异步的 - 你不能只是连接然后运行你的查询,你必须等到连接完成,因此回调。查看代码时,它似乎可以在准备好发送查询时发出connect
事件,因此您不必直接在connect()
方法上使用回调。data
事件in the documentation for the query object,也没有在代码中看到一个。您可以使用row
事件,或者您可以直接在查询上使用回调,如主页上的示例所示 - 这就是我为了简单起见而在此完成的工作。count
属性,row[0]
只会是第一个结果 - 我认为您希望整个length
属性{ {1}}数组如果您正在查找返回的行数。我不知道你是否有充分的理由使用rows
函数而不是直接将代码放在程序中,但我认为你可以更接近你所追求的内容:
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
对象,该对象将为您提供所有行和行计数以用于您想要的内容。
答案 1 :(得分:-1)
所以这就是我能够解决问题的方法....我将var query
移到了函数内部
function getNEO(state, callback) {
var conString = "postgres://alexa:al@alexadb2.cgh3p2.us-east-1.redshift.amazonaws.com: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);
});
}