3

我在节点中使用 postgresql 模块'pg'。当从数据库返回一行时,我想做一些处理,但我不知道如何将值返回给调用函数。

var caller = function(){
    var query = client.query(qString);
    query.on('row', function(row){
        if (row.foo == bar) {
            return true;
        } else {
            return false;
        }
    }
};

当我打电话时:

var boo = caller();

我希望 boo 等于回调的返回布尔值。

我试图声明一个未初始化的变量,然后分配返回的布尔值,

var caller = function(){
    var fido;
    var query = client.query(qString);
    query.on('row', function(row){
        if (row.foo == bar) {
            fido = true;
        } else {
            fido =  false;
        }
    }
    return fido;
};

但该函数不会等到 'pg' 返回一行。这会导致返回的变量返回未定义。我想我需要同步调用其中的一部分,以便在函数返回变量之前分配变量,但我不确定如何为普通函数执行此操作。

编辑:

伪代码就够了。我是 Node 新手,并试图在提问方面做得更好。这是我所在的一个类的应用程序。我用 web.py 用 python 编写了大部分内容,并且由于与 angular.js 框架冲突并在 node.js 中重新编写,我没有太多经验和。我遇到问题的部分是身份验证用户。这是被调用的模块。

var postAuth = function(params, callback){
    var user = params['username'];
    var pass = params['password'];
    var result;
    util['dispatch']['auth'](user, function(blah){
        if (pass == blah) {
            result = true;
        } else {
            result = false;
        }
    });
    console.log(result);
    return callback(200, "OK", {}, result);
}

以及从数据库获取用户名密码的函数:

var auth = function(user, callback) {
    client.connect();
    var qString = "SELECT password FROM users WHERE username='" + user + "'";
    var query = client.query(qString);
    query.on('row', function(row) {
            callback(row.password);
    }); 
};  

我知道这是一种不安全的身份验证方式。我想知道是否有更好的方法来做到这一点。我试图根据密码是否匹配返回一个布尔值。

4

2 回答 2

2

你不能使异步函数同步(这也意味着从异步函数返回值——通常——没有效果)。

处理异步函数结果的常见解决方案是传递一个回调函数,该函数在结果可用时被调用:

var caller = function(callback) {
  var query = client.query(qString);
  query.on('row', function(row){
    callback(row.foo == bar);
  }
};

// and to call it:
caller(function(result) {
  console.log('I received a result:', result);
});

回调函数将一次被调用一行。

于 2013-04-16T17:04:05.817 回答
0

我在这篇博文https://glebbahmutov.com/blog/promisify-event-emitter/中展示了如何从事件发射器返回承诺

于 2015-01-28T19:53:03.017 回答