无法操纵诺言返回的价值

时间:2019-11-17 04:04:15

标签: javascript node.js database promise

我使用以下代码来调用数据库查询(Node.js)。在我将数据输出返回到调用函数的意义上,该代码似乎有效。问题是我似乎无法操纵这些数据...我不知道问题出在什么地方。

数据库脚本('queries.js'):

function getFinals() {
 return new Promise(function(resolve, reject) {

  pool.query('SELECT * FROM users', (error, results) => {
   if (error) {
   reject(new Error('Ooops, something broke!'));
   } else {
   resolve(results.rows);
   }
  })  //pool.query

 }); 
}

我的“主要”脚本:

const db = require('./routes/queries');

app.get('/lookup', function (req, res) {

 db.getFinals()
 .then(function(value) {
 console.log('Async success!', value);
 })
 .catch(function(err) {
 console.log('Caught an error!', err);
 });

});

我从数据库调用中获得的数据从console.log中的“值”显示出来。但是,我不能对这个变量数据做任何事情。我希望运行一个循环,例如:

for (_count = 0; _count < (value.length - 1); _count++) {
console.log("count...!" + _count);
}

但是什么也没发生,循环不会执行。看来“值”是不确定的...为什么...?我如何使用从(看似)功能数据库调用返回的数据...?这是非常令人沮丧的...任何建议表示赞赏。

包含循环的完整调用函数:

app.get('/lookup', function (req, res) {

db.getFinals()
  .then(function(value) {
  console.log('Async success!', value);

   for (_count = 0; _count < (value.length - 1); _count++) {
   console.log("count...!" + _count);
   }

  })
  .catch(function(err) {
  console.log('Caught an error!', err);
  });

});

console.log中的输出如下:

Async success! [ { name: 'administration',
cred: 'peace',
status: 'active',
login: '2090',
logout: 'na',
service: 'both',
lucky: 'na',
picture: null,
picturex: null,
vod: null,
vodx: null,
legacy: 'na' } ]

等于它应显示的内容。另一个奇怪的是,它打印两次...尽管数据库表中只有1条记录...不确定这是一个问题还是应答呼叫的正常行为...?

1 个答案:

答案 0 :(得分:0)

在上面获取数据时,问题在于循环:数组基于零,而您正在做_count < (result.length - 1),这意味着您不会循环访问最后一条记录。在您的情况下,只有一行,因此它不会循环。

正确的语法为:i < result.length

查看演示:

const result = [ { name: 'administration',
cred: 'peace',
status: 'active',
login: '2090',
logout: 'na',
service: 'both',
lucky: 'na',
picture: null,
picturex: null,
vod: null,
vodx: null,
legacy: 'na' } ];

for (_count = 0; _count < (result.length - 1); _count++) {
  console.log(`existing loop: name is ${result[i].name}`);
}

for (let i = 0; i < result.length; i++) {
  console.log(`correct loop: name is ${result[i].name}`);
}