2014-11-25 41 views
0

我将node.js中的应用程序连接到postgresql并获取结果并将其转换为Json。但是当我向node.js路由发出请求时,我将结果添加到变量中,在该变量中存储数据库结果,而不是每次都加载。将node.js连接到postgresql时结果不正确

的代码片段是这样的:

function getDBData(request,response,next){ 
    console.log(request.params); 

    var client = new pg.Client(connStr); 

     // Connecting to the client 
    client.connect(function(err) { 
     if (err) { 
     return console.error('could not connect to postgresq',err); 
     }  
      console.log('CONNECTION ESTABLISHED'); 
     }) 

    // Querying the DB 
     var query = client.query('SELECT * FROM city'); 
     var i = 0; 
     query.on('row', function(row) { 

       if(i == 0){ 
      rowData = rowData + row; 
        i++;  
     }else{ 
        rowData = rowData +","+ row; 
        i++; 
       } 
     }); 

      swiftarr= JSON.stringify(rowData); 
      //client.end();  
      response.send(200,swiftarr).end(); 
} 

app.get('/mycity',getDBData) 
在swiftarr可变

结果得到所附,而不是与每一个请求得到替换。

我在浏览器中得到的结果是一样 “[目标对象],[目标对象] [对象对象],[目标对象]”

每个请求,我应该得到这样的事情 相反 [目标对象],[目标对象]


因为在我的分贝我只有两个记录。 例如。 如果我发出第一个请求,下一次有两条记录进入结果变量 ,而不是被替换,它将被追加并将四条记录写入结果变量。

我不知道我是否做出任何逻辑错误。

+0

可能重复[如何返回从Ajax调用的响应?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-呼叫) – 2014-11-25 11:45:38

+0

这与ajax调用无关。我能够获得响应,但我的响应结果正在追加,而不是被每个请求取代...... @ BenFortune – anand 2014-11-25 11:49:54

+0

由于您的请求的性质,它是相关的。这是一个异步请求,您试图在返回结果之前返回结果。 – 2014-11-25 11:54:07

回答

1

你的代码是异步的,你等待你的结果来填充之前要调用response.end()

function getDBData(request, response, next) { 

    var client = new pg.Client(connStr); 

    // Connecting to the client 
    client.connect(function(err) { 
     if (err) { 
      return console.error('could not connect to postgresq', err); 
     } 
     console.log('CONNECTION ESTABLISHED'); 
    }) 

    // Querying the DB 
    var query = client.query('SELECT * FROM city'); 
    var rowData = []; 

    query.on('row', function(row) { 
     rowData.push(row); 
    }); 

    query.on('end', function(){ 
     var swiftarr = JSON.stringify(rowData); 
     response.send(200, swiftarr).end(); 
    }); 
} 
+0

Thanx很多..它工作得很好,而且我明白你的意思。 – anand 2014-11-25 12:17:34

0

您应该在某处将rowData = null的变量取消设置,或者在var rowData = {}的执行开始时将其定义为局部变量。目前您只是将其分配给全局范围。

试试这个:

function getDBData(request,response,next){ 
    console.log(request.params); 

    var client = new pg.Client(connStr); 

     // Connecting to the client 
    client.connect(function(err) { 
     if (err) { 
     return console.error('could not connect to postgresq',err); 
     }  
      console.log('CONNECTION ESTABLISHED'); 
     }) 

    // Querying the DB 
     var query = client.query('SELECT * FROM city'); 
     var i = 0; 
     var rowData = {}; 
     query.on('row', function(row) { 

       if(i == 0){ 
        rowData = rowData + row; 
        i++;  
       } else { 
        rowData = rowData +","+ row; 
        i++; 
       } 
     }); 

      swiftarr= JSON.stringify(rowData); 
      //client.end();  
      response.send(200,swiftarr).end(); 
} 
+0

关于在本地声明它给消息rowData没有定义... – anand 2014-11-25 11:29:52