当我尝试使用简单的函数来查询我的网络应用程序的数据时,我遇到了烦恼。想法是使用一个函数列出一个表的内容;另一个使用此表中的user-selected record_id
来查询另一个表中的详细内容数据的函数。
运行时,应用程序在没有数据的情况下运行两个函数而没有任何错误。检查控制台,发现第二个函数查询结果是null
(我console.log
第二个函数的输入,发现他们得到并使用正确的查询键)。因为我确信数据库有查询数据。
我试过了:
psql
命令行使用相同的查询键查询数据,我的结果没有问题;所以功能应该有效。现在我的问题是为什么把它们放在应用程序中并让它们自己运行,它们没有得到查询结果?
我正在使用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);
});
});
}
上面的函数只是尝试获取“item1”和“dataset1”以供将来使用,并将它们传递给下面的函数args。它完美地完成了它的工作。
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”是包含函数的模块名称。)
我终于找到了问题,这是一个低级错误,与数据库和查询无关。项目名称来自应用程序的下拉列表,它是函数args的源,有一个“”(空格)附加到名称的末尾(我不知道为什么?),它总是“!=”记录在数据库中:-(所以在应用程序中总是没有查询结果。但是对于功能测试,我硬编码正确的项目名称“==”数据库中的记录。因为它是“”,即使我在控制台.log(itemName),我最后没找到空格。
事实证明是“空间的错误”。