Результат запроса JS mysql

#javascript #mysql #promise

#javascript #mysql #обещание

Вопрос:

Я совсем новичок в Node JS и пытаюсь использовать базу данных mysql.

Я попробовал другую вещь, например, использовать promise для получения результата моего запроса, но ожидание пропущено, и обещание находится на рассмотрении.

Я немного растерялся, если кто-нибудь может объяснить мне, как это работает.

 import * as CMD from "../command/importCommand.js";

export class Message {
    constructor(bot, database) {
        this.bot = bot;
        this.db = database;
    }

    eventHandler(msg) {
        const guild = msg.guild;
        const prefix = this.db.getPrefixFromGuild(guild);
        console.log(prefix);
        //
        //
    }
}
 
 import * as mysql from "mysql";

export class Database {

    constructor() {
        this.db = new mysql.createConnection({
            host: process.env.DB_HOST,
            user: process.env.DB_USER,
            password: process.env.DB_PASSWORD,
            database: process.env.DB_NAME
        });

        this.db.connect(err => {
            if (err) throw err;
            console.log('DB connected');
        });
    }

    async getPrefixFromGuild(guild) {
        let prefix = await this.getPrefixFromGuildId(guild.id);
        return prefix;
    }

    async getPrefixFromGuildId(guildId) {
        let prefix = await this.query("select prefix from serveur where id_serveur="   guildId   ";");
        return prefix;
    }
    query(sql) {
        return this.db.query(sql, (err, rows) => {
            if (err)
                throw err;
            console.log(rows);
            return rows;
        });
    }
}
 

Ответ №1:

Ваш eventHandler не является async функцией и не ожидает обещания, возвращенного из getPrefixFromGuild() . console.log() Оператор просто регистрирует обещание, а не его результат. Попробуйте это:

 async eventHandler(msg) {
    const guild = msg.guild;
    const prefix = await this.db.getPrefixFromGuild(guild);
    console.log(prefix);
}
 

Пожалуйста, также обратите внимание, что если вы получаете доступ к экземпляру вашего Database класса сразу после создания, он может не быть инициализирован, поскольку конструктор не ожидает conntect() завершения (это не должно, но вы должны найти другой способ предотвратить доступ к неинициализированному Database объекту).