Mysql 如何将typescript回调转换为promise

Mysql 如何将typescript回调转换为promise,mysql,typescript,promise,Mysql,Typescript,Promise,我想在班上做一个方法。此方法应连接到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

我想在班上做一个方法。此方法应连接到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;
    })
}
我希望有人能帮助我。因为我真的不想永远做一个守旧的xD

提前感谢。

创建一个新的承诺,并在query的回调函数中解决/拒绝它。然后回报承诺。现在,玩家是否存在返回一个Promise对象,该对象包含例如then函数

你必须确保你有一个承诺类可用。这取决于你的环境


请注意,如果不清理您的输入用户名,您的应用程序将容易受到攻击,攻击者可能会劫持您的应用程序。

提示1。请使用某种工厂功能来建立连接,并在以后重新使用

提示2。用于防止SQL注入

提示3。请使用一些promise库进行类似或类似的操作。大多数第三方promise库都有很多有用的实用方法来处理promisify上的promise。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);
}

我编写了一个简单的npm包,以保持类型安全的方式来实现这一点:


它要求您使用typescript@^4.0即将发布的版本,目前仅适用于流行格式err、result=>{}的回调。

Promisify是内置节点,不需要外部库。从'util'导入{promisify}True,现在是
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;
}
// 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);
}