Correctly using promises with node-mysql
Remove the async method call from the constructor, and make the async method return the instance (this):
class Player {
  constructor(user_id, socket, connection) {
    this.socket = socket;
    this.connection = connection;
  }

  async loadUser() {
    let _self = this;
    return new Promise((resolve, reject) =&gt; {
      _self.connection.query(`SELECT * FROM users WHERE id = ${this.user_id}`, (err, res) =&gt; {
        this.user = res[0];
        resolve(this)
      });
    })
  }
}

Then you can instantiate a new Player and wait for it to load the necessary data from the database, all in one line, like this:
const player = await new Player(user_id, socket, connection).loadUser();

Or like this:
new Player(user_id, socket, connection).loadUser().then(player =&gt; {

});