Usar Cloud SQL con Node.js

Esta parte del instructivo de Bookshelf en Node.js muestra cómo la app de ejemplo almacena sus datos persistentes en Google Cloud SQL.

Esta página forma parte de un instructivo de varias páginas. Ve a la aplicación Bookshelf en Node.js para comenzar desde el principio y leer las instrucciones de configuración.

Crear una instancia de Cloud SQL

Cómo instalar el proxy de SQL

Descarga y también instala el proxy de Cloud SQL. El proxy de Cloud SQL se usa para conectarte a tu instancia de Cloud SQL cuando se ejecuta de manera local.

Linux de 64 bits

  1. Descarga el proxy:
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
    
  2. Haz que el proxy sea ejecutable:
    chmod +x cloud_sql_proxy
    

Linux de 32 bits

  1. Descarga el proxy:
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
    
  2. Haz que el proxy sea ejecutable:
    chmod +x cloud_sql_proxy
    

macOS de 64 bits

  1. Descarga el proxy:
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
    
  2. Haz que el proxy sea ejecutable:
    chmod +x cloud_sql_proxy
    

macOS de 32 bits

  1. Descarga el proxy:
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
    
  2. Haz que el proxy sea ejecutable:
    chmod +x cloud_sql_proxy
    

Windows de 64 bits

Para descargar el proxy, haz clic con el botón secundario en https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe y selecciona "Guardar vínculo como…". Cámbiale el nombre a cloud_sql_proxy.exe.

Windows de 32 bits

Para descargar el proxy, haz clic con el botón secundario en https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe y selecciona "Guardar vínculo como…". Cámbiale el nombre a cloud_sql_proxy.exe.
Si tu sistema operativo no se incluye aquí, también puedes compilar el proxy desde la fuente.

Crear una instancia de Cloud SQL

  1. Crea una instancia de Cloud SQL para MySQL de segunda generación. Asigna a la instancia el nombre library o uno similar. Es posible que la instancia tarde algunos minutos para estar lista. Cuando esté lista, debería poder verse en la lista de instancias.
  2. Ahora, usa el SDK de Cloud desde la línea de comandos para ejecutar el siguiente comando. Copia el valor que se muestra para connectionName, ya que lo necesitarás en el paso siguiente.
    gcloud sql instances describe [YOUR_INSTANCE_NAME]

    El valor de connectionName tiene el formato [PROJECT_NAME]:[REGION_NAME]:[INSTANCE_NAME].

Inicializa la instancia de Cloud SQL

  1. Inicia el proxy de Cloud SQL con el valor de connectionName del paso anterior.

    Linux o macOS

    ./cloud_sql_proxy -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:3306

    Windows

    cloud_sql_proxy.exe -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:3306

    Reemplaza [YOUR_INSTANCE_CONNECTION_NAME] por el valor de connectionName que guardaste en el paso anterior.

    Este paso establece una conexión desde tu computadora local hasta tu instancia de Cloud SQL a fin de realizar pruebas locales. Mantén el proxy de Cloud SQL en ejecución durante todo el tiempo que realices pruebas locales en tu aplicación.

  2. Luego, crea un usuario y una base de datos de Cloud SQL nuevos.

    CONSOLE

    1. Crea una base de datos nueva con GCP Console para tu instancia library de Cloud SQL. Por ejemplo, puedes usar el nombre bookshelf.
    2. Crea un usuario nuevo con GCP Console para tu instancia library de Cloud SQL.

    CLIENTE MYSQL

    1. En una pestaña independiente de la línea de comandos, usa el cliente MySQL o un programa similar para conectarte a tu instancia. Ingresa la contraseña raíz que configuraste cuando te la pidan.
      mysql --host 127.0.0.1 --user root --password
      
    2. Usa los siguientes comandos para crear las bases de datos, los usuarios y los permisos de acceso necesarios en tu base de datos de Cloud SQL. Reemplaza [MYSQL_USER] y [MYSQL_PASSWORD] por el nombre de usuario y la contraseña que desees.
      CREATE DATABASE bookshelf;
      CREATE USER '[MYSQL_USER]' IDENTIFIED BY '[MYSQL_PASSWORD]';
      GRANT ALL ON . TO '[MYSQL_USER]';
      

Configuraciones

En el directorio nodejs-getting-started/2-structured-data, crea un archivo config.json con este contenido:

{
  "GCLOUD_PROJECT": "[YOUR_PROJECT_ID]",
  "DATA_BACKEND": "cloudsql",
  "MYSQL_USER": "[YOUR_MYSQL_USERNAME]",
  "MYSQL_PASSWORD": "[YOUR_MYSQL_PASSWORD]",
  "INSTANCE_CONNECTION_NAME": "[YOUR_INSTANCE_CONNECTION_NAME]"
}
  1. Reemplaza [YOUR_PROJECT_ID] por el ID del proyecto.

  2. Reemplaza [YOUR_MYSQL_USERNAME] y [YOUR_MYSQL_PASSWORD] por el nombre de usuario y la contraseña de Cloud SQL que creaste anteriormente.

  3. Reemplaza [YOUR_INSTANCE_CONNECTION_NAME] por el Instance Connection Name de tu instancia de Cloud SQL.

Luego, agrega el siguiente contenido al final de app.yaml. Asegúrate de reemplazar [YOUR_INSTANCE_CONNECTION_NAME] por el Instance Connection Name de tu instancia de Cloud SQL.

beta_settings:
  cloud_sql_instances: [YOUR_INSTANCE_CONNECTION_NAME]

Instalar dependencias

Instala las dependencias en el directorio nodejs-getting-started/2-structured-data mediante npm:

    npm install

Crear una base de datos y una tabla

Para inicializar la base de datos SQL, ingresa este comando con el proxy de Cloud SQL en ejecución:

npm run init-cloudsql

Una vez finalizada, la secuencia de comandos muestra un mensaje que indica que creaste el esquema correctamente.

Ejecutar la aplicación en la máquina local

  1. Usa npm para iniciar un servidor web local:

        npm start
    
  1. En el navegador web, ingresa la siguiente dirección:

    http://localhost:8080

Ahora puedes navegar por las páginas web de la app y agregar, editar y borrar libros.

Implementar la aplicación en el entorno estándar de App Engine

  1. Implementa la aplicación de muestra desde el directorio nodejs-getting-started/2-structured-data:

    gcloud app deploy
    
  2. En el navegador web, ingresa la siguiente dirección. Reemplaza [YOUR_PROJECT_ID] por el ID del proyecto:

    https://[YOUR_PROJECT_ID].appspot.com
    

Si actualizas tu app, podrás implementar la versión actualizada mediante el mismo comando que usaste para implementar la app por primera vez. La implementación nueva crea una versión nueva de la app y la convierte a la versión predeterminada. Se conservan las versiones anteriores de la aplicación. De forma predeterminada, el entorno estándar de App Engine escala a 0 instancias cuando no hay tráfico entrante a una versión, por lo que las versiones sin usar no deben tener costo. Sin embargo, todas estas versiones de la aplicación son recursos facturables.

Consulta la sección Limpiar en el paso final de este instructivo para obtener más información sobre la limpieza de recursos facturables, incluidas las versiones de la aplicación no predeterminadas.

Estructura de la aplicación

El siguiente diagrama muestra los componentes de la aplicación y la manera en que se conectan entre sí.

Estructura de la app de Bookshelf

Comprensión del código

En esta sección se explica el código de la aplicación y su funcionamiento.

Cómo controlar los envíos de los usuarios con formularios

El formulario para agregar y editar permite que los usuarios agreguen y editen envíos de libros dentro de la app.

Imagen de un formulario para agregar y editar

El formulario HTML se crea con Pug, que es un motor de plantillas de Node.js. La siguiente plantilla de Pug especifica que el formulario incluye campos de entrada de texto para el título, el autor, la fecha de publicación y la descripción (Title, Author, Date Published y Description):

block content
  h3 #{action} book
  form(method="POST")
    .form-group
      label(for="title") Title
      input.form-control(type="text", name="title", id="title", value=book.title)
    .form-group
      label(for="author") Author
      input.form-control(type="text", name="author", id="author", value=book.author)
    .form-group
      label(for="publishedDate") Date Published
      input.form-control(type="text", name="publishedDate", id="publishedDate", value=book.publishedDate)
    .form-group
      label(for="description") Description
      input.form-control(type="text", name="description", id="description", value=book.description)
    .form-group
    button.btn.btn-success(type="submit") Save

Cómo controlar los envíos de formularios

Cuando un usuario hace clic en Agregar libro, el siguiente código en books/crud.js envía al usuario a la página /add de la aplicación, que muestra el formulario para agregar o editar.

router.get('/add', (req, res) => {
  res.render('books/form.pug', {
    book: {},
    action: 'Add'
  });
});

Cuando el usuario llena el formulario Agregar libro y hace clic en Guardar, el siguiente código controla la acción HTTP POST del formulario y pasa los datos a la función model.create para comenzar el proceso de enviarlos a la base de datos de Cloud SQL.

router.post('/add', (req, res, next) => {
  const data = req.body;

  // Save the data to the database.
  getModel().create(data, (err, savedData) => {
    if (err) {
      next(err);
      return;
    }
    res.redirect(`${req.baseUrl}/${savedData.id}`);
  });
});

El archivo books/model-cloudsql.js contiene el código que ejecuta funciones CRUD para los datos almacenados en la base de datos de Cloud SQL. Por ejemplo, la instrucción model.create llama a la función create en model-cloudsql.js, que envía los datos recibidos del usuario a la función INSERT.

function create (data, cb) {
  connection.query('INSERT INTO `books` SET ?', data, (err, res) => {
    if (err) {
      cb(err);
      return;
    }
    read(res.insertId, cb);
  });
}

Cuando un usuario edita la información de un libro después de enviarlo, se llama a la función update en model-cloudsql.js, que ejecuta una operación UPDATE SQL para actualizar la información del libro en la base de datos.

function update (id, data, cb) {
  connection.query(
    'UPDATE `books` SET ? WHERE `id` = ?', [data, id], (err) => {
      if (err) {
        cb(err);
        return;
      }
      read(id, cb);
    });
}

Una vez que los usuarios agreguen libros, el vínculo Libros permite navegar a la página /books que muestra una lista de todos los libros almacenados actualmente en la base de datos de Cloud SQL. La función list usa los datos recuperados de la base de datos de Cloud SQL para mostrar la lista de todos los libros.

function list (limit, token, cb) {
  token = token ? parseInt(token, 10) : 0;
  connection.query(
    'SELECT * FROM `books` LIMIT ? OFFSET ?', [limit, token],
    (err, results) => {
      if (err) {
        cb(err);
        return;
      }
      const hasMore = results.length === limit ? token + results.length : false;
      cb(null, results, hasMore);
    }
  );
}

La instrucción SELECT SQL en la función list incluye una cláusula LIMIT que especifica la cantidad de registros que se mostrarán desde la base de datos. La instrucción SELECT SQL también usa la palabra clave OFFSET, que especifica el punto de partida para administrar la paginación y permite que se soliciten páginas adicionales según el valor de token.

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…