2017-05-26 5 views
1


私のクラスでメソッドを作成したいと思います。このメソッドは、MySQLデータベースに接続する必要があります。私は自分のSQLコードを作成しました。そして、今私はコールバックをしたくないのです。これは古いので、私は約束を使い始めたいのです。タイプスクリプトコールバックを約束に変換するには

public does_player_exist(username: string, callback: any) { 
    this.mysql.connect(); 
    this.mysql.query('USE devdb'); 
    this.mysql.query('SELECT p_name FROM players WHERE p_name = "'+username+'"', (err: Error, result: any[]) { 
     if (result.length === 1) { 
      callback(true) 
     } else { 
      callback(false); 
     } 
    }); 
} 

そして、ここで私は約束を作ってみましたが、私は失敗した方法は以下:

public does_player_exist(username: string): Promise<boolean> { 
    this.mysql.connect(); 
    this.mysql.query('USE devdb'); 
    return this.mysql.query('SELECT p_name FROM players WHERE p_name = "'+username+'").toPromise().then((result) => { 
     return result.length === 1; 
    }) 
} 

私は、このメソッドを呼び出すとき:

をコールバック(古い学校)で

My機能

service.does_player_exist('test').then((result) => { console.log(result) }) 

誰かが私を助けてくれることを願っています。私は本当に永遠に古い学校になりたくないのでxD

ありがとうございます。

答えて

1

new Promiseを作成し、コールバック関数queryでそれを解決するか拒否してください。約束を返す。今does_player_existは、たとえば、あなたが利用可能Promiseクラスを持っていることを確認する必要がありますthen機能

public does_player_exist(username: string, callback: any): Promise<boolean> { 
    this.mysql.connect(); 
    this.mysql.query('USE devdb'); 
    var promise = new Promise<boolean>(); 
    this.mysql.query('SELECT p_name FROM players WHERE p_name = "'+username+'"', (err: Error, result: any[]) { 
     if (!err) promise.resolve(!!result.length);    
     else promise.reject(); 
    }); 
    return promise; 
} 

が含まれているPromiseオブジェクトを返します。それはあなたの環境に依存します。

あなたの入力(ユーザ名)を消毒することなく、アプリケーションが脆弱で攻撃者があなたのアプリをハイジャックする可能性があることにご注意ください。

0

ヒント#1。あなたの接続を構築し、後でそれを再利用するために、何らかの種類のファクトリ関数を使用してください。

ヒント#2。 SQLインジェクションを防ぐには、prepared statementを使用してください。

ヒント#3。 BluebirdまたはQのようなものについては、約束のライブラリを使用してください。サードパーティの約束図書館のほとんどは、それらの約束事を働かせるための有用なユーティリティメソッドがたくさんあると約束されています。 Promisifyは、nodejs型コールバック関数を約束を返す関数にラップすることができます。 例は次のようになります:

// it's not a factory function* 
public query() { 
    this.mysql.connect(); 
    this.mysql.query('USE devdb'); 

    return Promise.promisify(this.mysql.query.bind(this.mysql)) 
} 

public does_player_exist(username: string): Promise<boolean> { 
    return this 
     .query('SELECT p_name FROM players WHERE p_name = ?', [username]) 
     .then(result => result.length === 1); 
} 
関連する問題