私はノードを使い慣れておらず、小さなアプリケーションを書いています。私は前にサーバー上でこのような非同期言語を使用していませんでしたし、ちょっとしたピクルスで自分自身を持っています。私は文字列を取得し、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
変数を返すようにしたいが、挿入クエリが終了した後でなければならない。
最も簡単な方法は約束を使用することです。 http://stackoverflow.com/a/41567664/3830485 –
「generateToken」は外部ライブラリと統合されているので、約束を返す柔軟性はありません。トークン文字列を返す必要があります。私はそれがdbに保存されていない限り、それをしたくありません。 –
@FrankConryあなたのgenerateToken関数がすでに誰かによって使用されているので、構造体を変更できないことを理解していますか? –