2017-02-02 10 views
0

私はノードを使い慣れておらず、小さなアプリケーションを書いています。私は前にサーバー上でこのような非同期言語を使用していませんでしたし、ちょっとしたピクルスで自分自身を持っています。私は文字列を取得し、IDのテーブルをクエリし、結果を使用して2番目のテーブルに挿入し、次に2つのレベルの関数から文字列を返す必要があります。私はdbのもののために使用するカスタムdaoを持っています。node.jsとpgのネストされた約束

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変数を返すようにしたいが、挿入クエリが終了した後でなければならない。

+0

最も簡単な方法は約束を使用することです。 http://stackoverflow.com/a/41567664/3830485 –

+0

「generateToken」は外部ライブラリと統合されているので、約束を返す柔軟性はありません。トークン文字列を返す必要があります。私はそれがdbに保存されていない限り、それをしたくありません。 –

+0

@FrankConryあなたのgenerateToken関数がすでに誰かによって使用されているので、構造体を変更できないことを理解していますか? –

答えて

1

deasyncという名前のライブラリがあります。

APIだから、これはプライマリおよびおそらく唯一の使用である単に約束またはコールバックを要求 パラメータ

を返すように変更できない場合 そして、それを作成するための動機は、状況を解決することでした場合。一般的に、Node.jsは非同期にしておく必要があるからです。あなたは基本的にコールバックを受け入れる関数を記述して、次のようにdeasyncでそれをラップする必要がありますトリック行うに

var deasync = require('deasync'); 
 

 
//It can still take the params before the callback 
 
var asyncGenerateToken = function (data, userId, client, callback) { 
 
\t var token = 'abc'; 
 

 
\t //Async operation starts here 
 
\t setTimeout(function() { 
 
\t \t //Async operation is finished, now we can return the token 
 
\t \t //Don't forget that the error is 1st arg, data is the 2nd 
 
\t \t callback(null, token); 
 
\t }, 1000); 
 
}; 
 

 
var generateToken = deasync(asyncGenerateToken); 
 

 
//We'll retrieve a token only after a second of waiting 
 
var token = generateToken('my data', 'my user id', 'my client'); 
 
console.log(token);

は、この情報がお役に立てば幸いです。

関連する問題