Reputation:
i want to make a method in my class. This method should connect to a MySQL database. I created my SQL code. And now I don't want to do a callback because this is old, I want to start using promises.
My function with callback (old school):
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);
}
});
}
And here follows the method I tried to make a promise, but I failed:
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;
})
}
When I call this method:
service.does_player_exist('test').then((result) => { console.log(result) })
I hope someone can help me. Because I really don't want to be old school forever xD
Thanks in advance.
Upvotes: 1
Views: 2285
Reputation: 12032
I wrote a simple npm package to do this in a way that retains type-safety:
It requires you use typescript@^4.0
(upcoming release) and currently only works for callbacks in the popular format of (err, result) => {}
.
Upvotes: 1
Reputation: 438
Tip #1. Please use some kind of factory function to build your connection and reuse it later on.
Tip #2. Use prepared statement to prevent SQL injection.
Tip #3. Please use some promise library for that like Bluebird or Q. Most of the 3rd party promise libraries have a lot of useful utility methods to work with promises on of them is promisify. Promisify can wrap any nodejs type callback function into function which returns a promise. Your example would look like:
// 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);
}
Upvotes: 1
Reputation: 8407
create a new Promise
and resolve it / reject it in the callback functions of query
. then return the promise. now does_player_exist
returns a Promise
object which contains for example then
function
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;
}
you will have to make sure that you have a Promise
class available. that depends on your environment.
please be aware that without sanitizing your input (username) your application will be vulnerable and attackers could hijack your app.
Upvotes: 3