2017-02-02 2 views
0

저는 노드를 처음 사용하고 작은 애플리케이션을 작성합니다. 나는 전에 서버에서 비동기 언어를 사용하지 않았으며 약간의 피클에 빠져있다. 문자열을 가져 와서 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 변수를 반환하지만 삽입 쿼리가 끝난 후에야합니다.

+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);

희망을.