2016-08-18 177 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