2017-06-18 78 views
0

我尝试使用简单函数来查询我的Web应用程序的数据时遇到了一个麻烦。这个想法是使用一个函数来列出一个表的内容;另一个函数使用此表中的user-selected record_id查询另一个表中的详细内容数据。来自postgresql函数的查询数据在应用程序中不起作用,但在手动测试时起作用

运行时,应用程序运行这两个函数时没有任何错误,但没有数据。检查控制台,发现第二个函数的查询结果是null(我输入了第二个函数,发现他们得到并使用了正确的查询键)。因为我确信数据库有用于查询的数据。

我尝试:

  1. 使用psql命令行使用相同的查询键来查询数据,我有没有问题的结果;
  2. 我运行一个节点命令行,并尝试通过提供查询键来运行这两个函数,它也给了我正确的结果。

所以功能应该工作。现在我的问题是为什么把它们放在应用程序中让它们自己运行,它们没有得到查询结果?

我正在使用pg = require("pg");和const pool = new pg.Pool(config)用于数据库连接;

您的经验分享将非常感激。

(更新)功能是象下面这样:

function listItemDB(callback){ 

pool.connect(function(err, client, done) { 
    if(err) { 
    return console.error('error fetching client from pool', err); 
    } 

    //use the client for executing the query 
    client.query(`SELECT * FROM basicdb.items`, 
       function(err, result) { 
        //call `done(err)` to release the client back to the pool (or destroy it if there is an error) 
        done(err); 

        if(err) { 
         return console.error('error running query', err); 
        } 
        // console.log(result.rows); 
        callback(result.rows); 
    }); 
}); 

}

上述功能,只不过是想获得“物品1”和“数据集1”以备将来使用并传递给下面的函数参数。它完美地完成了它的工作。

function getFileName(itemName,datasetName, callback) { 

let fileName; 

console.log(itemName,datasetName); 

pool.connect(function(err, client, done) { 
    if(err) { 
     return console.error('error fetching client from pool', err); 
    } 

    client.query("SELECT * "+ 
       "FROM basicdb.dataset "+ 
       "INNER JOIN basicdb.items "+ 
       "ON basicdb.dataset.item_id = basicdb.items.item_id "+ 
       "WHERE (basicdb.items.item_name = ($1)) "+ 
        "AND (basicdb.dataset.datasetname = ($2))",[itemName,datasetName], 

        function (err, result){ 
         done(); 
         if(err) { 
          return console.error('error running query', err); 
         } 
         let records = result.rows; 
         fileName = records[records.length-1].filename; 
         callback(fileName); 
        }); 
}); 

}

此上述功能正在试图获得的文件名,因此主要的应用程序可以使用它。调用上面的函数在我的主app.js的代码是象下面这样:

db.getFileName("item1","dataset1",function(fileName) { 
//do something with the fileName....} 

(“DB”是模块的名称,其中包括的功能。)

+1

请出示你的代码的相关部分。最可能的是你是不是正确地链接异步调用,但这是没有任何代码的疯狂猜测...... – jcaron

+0

@Robin你需要发布你执行的代码,而不仅仅是天秤座初始化。 –

+0

@https:// stackoverflow。com/users/3527940/jcaron,@ https://stackoverflow.com/users/1102051/vitaly-t,试图粘贴相关代码。你能分享一下你的经验吗?非常感谢。 – Robin

回答

0

我终于发现了问题,这是一个低级别的错误,并且与数据库和查询无关。 从应用程序中的下拉列表中获取的项目名称(这些项目名称是函数参数的源代码)有一个附加到名称末尾的“(空格)”(我不知道为什么?),它总是“!=”在数据库中记录:-(在应用程序中总是没有查询结果,但是对于函数测试,我硬编码的数据库中的记录是正确的“==”项目名称,因为它是“”,即使当我执行console.log(ITEMNAME),我没有找到末尾的空间。

原来是“空间的一个错误”。

相关问题