Estaba intentando conectar AWS RDS con mi aplicación Node JS. Probé la conexión de RDS con MySQLWorkbench y se pudieron recuperar los datos. Sin embargo, al intentar obtener una conexión en mi aplicación Node, recibí un error:
TypeError: Cannot read property 'query' of undefinedMi código de Node JS es el siguiente:
const express = require('express'); const cors = require('cors'); const mysql = require('mysql'); const app = express(); const SELECT_ALL_QUERY = 'SELECT * FROM `my-schema`.`my-table`;'; app.use(cors()); app.get('/', (req, res) => { res.send('go to /my-table to see contents') }); const pool = mysql.createPool({ connectionLimit: 10, host: "process.env.myHostname", user: 'process.env.myUsername', password: 'process.env.myPassword', port: "process.env.3306", database: 'my-schema', debug: false }); pool.getConnection((err, connection) => { app.get('/my-table', (req, res) => { console.log(connection); connection.query(SELECT_ALL_QUERY, (err, results) => { if (err) { return res.send(err) } else { return res.json({ data: results }) }; }); }); }); let port = process.env.PORT || 4000; app.listen(port, () => { console.log(`App running on port ${port} `); });Por lo que parece, la conexión no estaba definida, ¿no se pudo conectar? Si es así, ¿por qué puedo ver los datos en MySQLWorkbench?
2 cosas:
Primero, está creando un grupo con valores no válidos. Este:
const pool = mysql.createPool({ connectionLimit: 10, host: "process.env.myHostname", user: 'process.env.myUsername', password: 'process.env.myPassword', port: "process.env.3306", database: 'my-schema', debug: false });DEBE ser esto:
const pool = mysql.createPool({ connectionLimit: 10, host: process.env.myHostname, user: process.env.myUsername, password: process.env.myPassword, port: process.env.myPort, database: 'my-schema', debug: false }); En segundo lugar, ¿cómo se ve err cuando console.log(err) 'd? Cambia esta parte:
pool.getConnection((err, connection) => { app.get('/my-table', (req, res) => { console.log(connection); connection.query(SELECT_ALL_QUERY, (err, results) => { if (err) { return res.send(err) } else { return res.json({ data: results }) }; }); }); });A esto:
pool.getConnection((err, connection) => { if (err) { return console.log('ERROR!', err); } if (!connection) { return console.log('No connection was found.'); } app.get('/my-table', (req, res) => { connection.query(SELECT_ALL_QUERY, (err, results) => { if (err) { return res.send(err) } return res.json({ data: results }); }); }); });Hermano, si usará el método createPool() con process.env, no olvide crear un archivo .env en el proyecto raíz y declarar las variables myHostname, myUsername, myPassword y myPort. Pero para que pruebes tu conexión más fácilmente usa esto:
const mysql = require('mysql'); const connection = mysql.createConnection({ host : 'localhost', user : 'root', password : 'secret', database : 'your_database' }); connection.connect(); connection.query('SELECT * FROM `my-schema`.`my-table`', function (error, results, fields) { if (error) throw error; console.log(results); }); connection.end();
TypeError: Cannot read property 'query' of undefined
El error anterior no es el error real, ya que esto ocurre durante el tiempo de consulta, mientras que debería detectar el error durante el tiempo de conexión. Una vez que la solución que publicó @NeoNexus DeMortis al hacer esto, obtendrá el error real.
Pero recomendaré verificar la conexión de la base de datos en el inicio de la aplicación para que al menos la aplicación verifique y espere la conexión de la base de datos antes de atender la solicitud del usuario y también evitará que la aplicación entre en un estado roto.
pool.getConnection((err, connection) => { if (err) console.log(err) else{ console.log("DB connected successfully host:",connection.config.host," DB:",connection.config.database) app.emit('ready'); } }); app.on('ready', function() { let port = process.env.PORT || 4000; app.listen(port, () => { console.log(`App running on port ${port} `); }); });En un esfuerzo por mantener las cosas simples y concisas, muchos tutoriales pasan por alto uno de los aspectos más humanos e intuitivos del desarrollo de JavaScript con node. EventEmitter del nodo.
esperando-las-conexiones-db-antes-de-la-aplicación-escuchar-en-el-nodo