node.js和pg中的嵌套承诺

node.js和pg中的嵌套承诺,node.js,postgresql,promise,Node.js,Postgresql,Promise,我是一个新的节点和编写一个小应用程序。我以前从未在服务器上使用过像这样异步的语言,这让我有点为难。我需要获取一个字符串,查询一个表中的id,然后使用结果插入到第二个表中,然后从函数中返回一个两级以上的字符串。我有一个自定义的dao用于数据库。以下是所有操作发生的函数: function generateToken(data, userId, client) { var random = Math.floor(Math.random() * 100001); var sha256

我是一个新的节点和编写一个小应用程序。我以前从未在服务器上使用过像这样异步的语言,这让我有点为难。我需要获取一个字符串,查询一个表中的id,然后使用结果插入到第二个表中,然后从函数中返回一个两级以上的字符串。我有一个自定义的
dao
用于数据库。以下是所有操作发生的函数:

function generateToken(data, userId, client) {
    var random = Math.floor(Math.random() * 100001);
    var sha256 = crypto.createHmac("sha256", random );
    var token = sha256.update(data).digest("base64");
    var query = dao.select(
        'auth.apps', 
        {  
            name: client.name, 
            version: client.version, 
            subversion: client.subversion, 
            patch: client.patch    
        }
    ).done(
        function(result) {
            dao.insert(
                'auth.tokens',  
                { 
                    user_id:userId, 
                    app_id: result.rows[0].id, 
                    token:token         
                } 
             ); 
             return "mmmm yellllo";
         }
    ); 

    var ret_val = await(query);
    console.log("Token return: " + ret_val);

    return ret_val;
}
以下是我的dao的相关部分供选择:

dbo.prototype.select = function(table, where, order_by) {

    var where_clause = this.construct_where(where);
    var sql = 'SELECT * FROM ' + table + ' WHERE ' + where_clause;

    if(order_by  !== undefined) {
        sql = sql + ' ORDER BY ' + order_by;
    };  
    var result = this.pool.query(sql);

    return result;
};
并插入:

dbo.prototype.insert= function(table, values) {
    var key_list='', value_list = ''; 

    for( var k in values) 
    {   
        key_list = key_list + ', ' + k;
        value_list = value_list + ", '" + values[k] + "'";
    }   

    // chop off comma space
    key_list = key_list.substring(2);
    value_list = value_list.substring(2);

    var sql = 'INSERT INTO ' + table + '(' + key_list + ') VALUES(' + value_list + ') RETURNING id';

    var result = this.pool.query(sql).catch(function(error) {
        console.log("SQL:" + sql + " error:" + error);
    });

    return result;
};
如何解除双重承诺。我希望
generateToken
函数返回
token
变量,但只能在insert查询完成后返回。

有一个名为的库。 创建它的动机是为了解决

不能将API更改为仅返回承诺或要求回调 参数

所以这是主要的,也可能是唯一的用例。因为通常Node.js应该保持异步

要做到这一点,您基本上应该编写一个接受回调的函数,然后用deasync将其包装,如下所示:

var deasync=require('deasync');
//它仍然可以在回调之前获取参数
var asyncGenerateToken=函数(数据、用户ID、客户端、回调){
var标记='abc';
//异步操作从这里开始
setTimeout(函数(){
//异步操作已完成,现在可以返回令牌
//不要忘记错误是第一个参数,数据是第二个参数
回调(空,令牌);
}, 1000);
};
var generateToken=deasync(异步generateToken);
//我们将仅在等待一秒钟后检索令牌
var token=generateToken(‘我的数据’、‘我的用户id’、‘我的客户’);

console.log(令牌)最简单的方法是使用承诺。看到了吗?generateToken集成了一个外部库,所以我不能灵活地返回承诺,我必须返回标记字符串,我不想这样做,除非它已保存在db中。@FrankConry据我所知,generateToken函数已被某人使用,因此您无法更改结构,对吗?是的,它是restify oauth框架的一部分