var pg = require('pg');
var conString = "postgres://postgres:abk@localhost/bot";
var res = [];
pg.connect(conString, function(err, client, done) {
if(err) {
return console.error('error fetching client', err);
}
client.query('SELECT * FROM bot.questions', function(err, result)
{
done();
if(err) {
return console.error('error running query', err);
}
res.push(result.rows[0]);
console.log(res); //inside function scope
});
});
console.log(res); // outside function scope
"的的console.log()"已在函数内部调用得到正确的结果数组,但在外部函数中,相同的数组变量显示空数组。我已经尝试了很多东西,例如回调,承诺节点js中的功能,但是无法看到结果" res"功能之外。 请建议我如何制作" res "变量可从函数外部访问。
注意:具体来说,我需要" console.log(res)"打印" res"在上面的代码中提到的函数之外。
答案 0 :(得分:0)
res变量确实可以在函数外部访问,因为它是在函数
之外定义的res变量确实填充在函数外部,因为它被视为填充在函数
中 问题的根本原因是外部打印在时间上比内部活动更早发生,因为函数是异步的,调用立即发出,然后继续执行代码中的最后一行。如果你只是特别想要获得价值,那确实就是这种情况
如果您只想在外面打印值,请使用延迟回调来打印内容
如果您想要在外部对值进行后处理,则需要通过同步原语将connect函数与下一个函数链接起来。
希望这有帮助。
答案 1 :(得分:0)
如前所述,查询的结果仅在回调被触发时才存在,因此在之前执行的代码的一部分中访问它是没有意义的。 您似乎需要阅读有关节点异步编程的一些信息。 我建议你阅读有关承诺和发电机的信息。
答案 2 :(得分:0)
我最终找到了一个解决方案,我已经为db config创建了单独的文件以及使用回调函数导出的结果值数组。这是" db.js "我创建的文件。
var pg = require('pg');
var conString = "postgres://postgres:abk@localhost/chatbot";
var resp = [];
function executeQuery (callback) {
pg.connect(conString, function(err, client, done) {
if(err) {
return console.error('error fetching client', err);
}
client.query('SELECT * FROM bot.questions', function(err, result) {
done();
if(err) {
return console.error('error running query', err);
}
resp.push(result.rows[0]);
// console.log(res);
callback(resp);
});
});
};
exports.executeQuery = executeQuery;
这个我已导入我的" app.js "像贝娄一样
var express = require('express')
var bodyParser = require('body-parser')
var request = require('request')
var app = express()
var db = require('./db')
app.post('/webhook/', function (req, res) {
db.executeQuery(function ( resp) {
console.log(resp);
});
});
这就是我现在可以访问" resp"作为结果数组,并且可以在任何需要的地方将其作为参数传递给任何函数。 根据我的要求,特别需要将db配置文件与app.js文件分开,否则我知道它也可以在相同的app.js文件中进行操作。 最后,这对我来说非常有用。
这就是我期待的一个例子。但我自己找到了。
无论如何,感谢您的参与和建议。