我想在班上做一个方法。此方法应连接到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;
})
}
当我称这种方法时:
service.does_player_exist('test').then((result) => { console.log(result) })
我希望有人可以帮助我。因为我真的不想永远老去xD
提前致谢。
答案 0 :(得分:1)
创建new Promise
并在query
的回调函数中解析/拒绝它。然后回复承诺。 now 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
课程。这取决于你的环境。
请注意,如果不清理您的输入(用户名),您的应用程序将容易受到攻击并且攻击者可能会劫持您的应用。
答案 1 :(得分:0)
提示#1。请使用某种工厂功能来建立您的连接并在以后重复使用。
提示#2。使用prepared statement来阻止SQL注入。
提示#3。请使用一些承诺库,例如Bluebird或Q。大多数第三方承诺库都有许多有用的实用方法来处理它们的承诺是promisify。 Promisify可以将任何nodejs类型的回调函数包装到返回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);
}
答案 2 :(得分:0)
我编写了一个简单的npm软件包,以保留类型安全的方式进行此操作:
它要求您使用typescript@^4.0
(即将发布的版本),并且当前仅适用于(err, result) => {}
流行格式的回调。