저는 노드를 처음 사용하고 작은 애플리케이션을 작성합니다. 나는 전에 서버에서 비동기 언어를 사용하지 않았으며 약간의 피클에 빠져있다. 문자열을 가져 와서 id에 대한 테이블을 쿼리 한 다음 결과를 사용하여 두 번째 테이블에 삽입 한 다음 두 레벨의 funtion에서 문자열을 반환해야합니다. 나는 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 함수가 이미 누군가에 의해 사용되어서 구조체를 바꿀 수 없다는 것을 이해합니다. –