Estoy creando mi bot de Discord y vi que el proveedor de alojamiento que compré venía con una base de datos mySQL, así que lo estoy usando. Me conecté con el paquete mySQL NPM:
export const con = mysql.createConnection({ host: process.env.MYSQL_HOST, port: process.env.MYSQL_PORT, user: process.env.MYSQL_USER, password: process.env.MYSQL_PASSWORD, database: process.env.MYSQL_DB, }); y funciona bien Creé una tabla en la base de datos, con 3 parámetros:
id: Discord user id
bananas: My toy currency
deposit: The currency deposit
Configuré que en el evento interactionCreate , cada vez que un usuario usa una interacción, verifica la base de datos, si hay un perfil, no hace nada, de lo contrario, crea el perfil en la base de datos. Código:
async checkDB(int: CommandInteraction | MessageComponentInteraction) { await con.query( `SELECT * FROM profileSchema WHERE id = '${int.user.id}'`, async (e: Error, rows: any) => { if (e) throw e; if (!rows[0]) { await con.query( `INSERT INTO profileSchema (id, bananas, deposit) VALUES ('${int.user.id}', 100, 0)` ); } } ); },este código funciona bien, el problema es que si un usuario no tiene un perfil en la base de datos, y usa un comando relacionado con la moneda , como el que muestra su saldo, el bot falla porque sus créditos en la base de datos resultan inexistentes, incluso aunque se crea el perfil y la segunda vez que usan el comando, ¡funciona correctamente! ¿Cómo puedo codificar para que, si el usuario no está en la base de datos y usa un comando, cree y muestre al mismo tiempo? Aquí está el código que verifica el saldo de la moneda:
await con.query( `SELECT * FROM profileSchema WHERE id = ${interaction.user.id}`, async (e: Error, rows: any[]) => { if (e) throw e; let wallet: { bananas: number; deposit: number; }; try { wallet = { bananas: rows[0].bananas, deposit: rows[0].deposit, }; } catch (e) { throw e return; } )Entonces, a menos que sea realmente necesario, no necesita los componentes async/await en esto, pero la respuesta simple que está buscando es cambiar if (!rows[0]) a if (!rows.length) pero eso funciona cuando usted configura su consulta como tal:
con.query(`SELECT * FROM profileSchema WHERE id = '${int.user.id}'`, (err, rows) => { if (err) throw err; if (!rows.length) { con.query(`INSERT INTO profileSchema (id, bananas, deposit) VALUES ('${int.user.id}', 100, 0)`, (err) => { if (err) throw err; }); } else { let wallet = { bananas: rows[0].bananas, deposit: rows[0].deposit, } } });