Javascript 为什么在使用pg时,如果我从函数返回查询结果,它会返回未定义的结果,但如果我将其记录在控制台日志中,它会打印出来?
这是我的代码:Javascript 为什么在使用pg时,如果我从函数返回查询结果,它会返回未定义的结果,但如果我将其记录在控制台日志中,它会打印出来?,javascript,postgresql,return,console.log,node.js-pg,Javascript,Postgresql,Return,Console.log,Node.js Pg,这是我的代码: const queryFirstNames = function (qString) { let firstNameMatches; client.query('SELECT * FROM famous_people WHERE first_name = $1', [qString], (err, result) => { if (err) { return console.error('error running query
const queryFirstNames = function (qString) {
let firstNameMatches;
client.query('SELECT * FROM famous_people WHERE first_name = $1', [qString], (err, result) => {
if (err) {
return console.error('error running query', err);
}
firstNameMatches = result.rows;
return firstNameMatches;
client.end();
});
};
console.log(queryFirstNames(qString));
});
但是如果我在函数内部匹配console.log firstname,而不是返回,然后在没有控制台日志记录的情况下调用函数
我想做的是返回这个查询的结果并在另一个函数中使用它,所以我不想让它控制台记录结果,但是当我尝试返回结果时,它会给我未定义的结果,并且也不会关闭数据库连接。我相信您遇到的问题是,当您返回firstNameMatches时,您只是将其返回给client.query的回调。firstNameMatches是在queryFirstNames函数的上下文中设置的,但是您永远不会返回它。也就是说,您还利用了对client.query的异步调用。这意味着当您从queryFirstNames函数返回时,很可能您还没有完成查询。根据这一点,我很确定你想要利用承诺来管理这件事或者其他答案中的一个 除此之外,您还需要将返回移动到client.end之前。为了处理我的答案,我创建了一个您可以看到的JSFIDLE。我必须通过promise创建自己的promise,以模拟执行查询的客户机
const queryFirstNames = function (qString) {
let firstNameMatches;
client.query('SELECT * FROM famous_people WHERE first_name = $1', [qString])
.then((result) => {
firstNameMatches = result.rows;
client.end();
return firstNameMatches;
})
.then(f => {
console.log(f);
})
.catch(e => {
if (err) {
return console.error('error running query', err);
}
});
};
我认为您遇到的问题是,当您返回firstNameMatches时,您只是将其返回给client.query的回调。firstNameMatches是在queryFirstNames函数的上下文中设置的,但是您永远不会返回它。也就是说,您还利用了对client.query的异步调用。这意味着当您从queryFirstNames函数返回时,很可能您还没有完成查询。根据这一点,我很确定你想要利用承诺来管理这件事或者其他答案中的一个 除此之外,您还需要将返回移动到client.end之前。为了处理我的答案,我创建了一个您可以看到的JSFIDLE。我必须通过promise创建自己的promise,以模拟执行查询的客户机
const queryFirstNames = function (qString) {
let firstNameMatches;
client.query('SELECT * FROM famous_people WHERE first_name = $1', [qString])
.then((result) => {
firstNameMatches = result.rows;
client.end();
return firstNameMatches;
})
.then(f => {
console.log(f);
})
.catch(e => {
if (err) {
return console.error('error running query', err);
}
});
};
您甚至在执行client.end()之前就返回了调用;这样,您的客户端连接将永远不会结束。您可以这样做:
const query = client.query(
'SELECT * FROM famous_people WHERE first_name = $1',
[qString],
(err, result) => {
if (err) {
return console.error('error running query', err);
}
});
query.on('row', (row) => {
results.push(row);
});
// After all data is returned, close connection and return results
query.on('end', () => {
return res.json(results);
});
您甚至在执行client.end()之前就返回了调用;这样,您的客户端连接将永远不会结束。您可以这样做:
const query = client.query(
'SELECT * FROM famous_people WHERE first_name = $1',
[qString],
(err, result) => {
if (err) {
return console.error('error running query', err);
}
});
query.on('row', (row) => {
results.push(row);
});
// After all data is returned, close connection and return results
query.on('end', () => {
return res.json(results);
});
谢谢分享!这有助于我正确地关闭数据库连接,但当我返回结果值时,它仍然返回未定义,但当我输入console.log时,它会打印正确的数组。谢谢分享!这有助于我正确地关闭数据库连接,但当我返回结果值时,它仍然返回未定义的,但当我返回console.log时,它会打印正确的数组。这非常感谢您所说的,非常有意义。但是,firstNameMatches变量似乎在client.end()之前只有一个值-因此,当我运行代码时,它返回未定义的console.logs,但如果我从查询内部输入console.log firstNameMatches,它将输出一个值。这就好像firstNameMatches不存在于查询范围之外,尽管我在父函数中定义了它,所以我对代码进行了更多的处理,似乎当我在查询中重置firstNameMatches的值时,它不会持久存在,所以当我在查询之外返回firstNameMatches时,它将返回它最初的值,而不是我在查询中设置的值。非常感谢您的帮助-您所说的非常有意义。但是,firstNameMatches变量似乎在client.end()之前只有一个值-因此,当我运行代码时,它返回未定义的console.logs,但如果我从查询内部输入console.log firstNameMatches,它将输出一个值。这就好像firstNameMatches不存在于查询范围之外,尽管我在父函数中定义了它,所以我对代码进行了更多的处理,似乎当我在查询中重置firstNameMatches的值时,它不会持久存在,所以当我在查询之外返回firstNameMatches时,它将返回它最初的值,而不是我在查询中设置的值。