Usar Cloud Datastore con Node.js

En esta página del tutorial de Bookshelf para Node.js, se explica cómo la aplicación de muestra almacena sus datos persistentes en Google Cloud Datastore. El código de muestra de este paso proporciona ejemplos sobre cómo crear, leer, actualizar y eliminar (CRUD) los datos almacenados en Cloud Datastore.

Esta página forma parte de un tutorial de varias páginas. Para empezar en orden y consultar las instrucciones de configuración, ve a la sección relativa a la aplicación Bookshelf para Node.js.

Establecer configuración

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

{
  "GCLOUD_PROJECT": "[YOUR_PROJECT_ID]",
  "DATA_BACKEND": "datastore"
}

Sustituye [YOUR_PROJECT_ID] por el ID del proyecto.

Cloud Datastore es un servicio totalmente administrado que se inicializa y se conecta automáticamente a tu aplicación de App Engine. No se requiere ninguna otra configuración.

Instalar dependencias

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

  • Con npm:

    npm install
    
  • Con yarn:

    yarn install
    

Ejecutar la aplicación en la máquina local

  1. Usa npm o yarn para iniciar un servidor web local:

    • Con npm:

      npm start
      
    • Con yarn:

      yarn start
      
  2. Introduce la siguiente dirección en el navegador web:

    http://localhost:8080

Ahora puedes navegar por las páginas web de la aplicación y añadir, editar y eliminar libros.

Desplegar la aplicación en el entorno flexible de App Engine

  1. Despliega la aplicación de muestra:

    gcloud app deploy
    

  2. Introduce la siguiente dirección en el navegador web. Sustituye [YOUR_PROJECT_ID] por el ID del proyecto:

    https://[YOUR_PROJECT_ID].appspot.com
    

Si actualizas la aplicación, podrás desplegar la versión actualizada con el mismo comando que utilizaste para desplegar la aplicación por primera vez. El nuevo despliegue crea una nueva versión de la aplicación y la establece como la versión predeterminada. No obstante, se conservarán las versiones anteriores, al igual que las instancias de máquina virtual asociadas. Ten en cuenta que todas estas versiones de la aplicación y las instancias de máquina virtual son recursos facturables.

Si eliminas las versiones no predeterminadas de la aplicación, puedes reducir los costes.

Para eliminar una versión de la aplicación, sigue las instrucciones que figuran a continuación:

  1. En GCP Console, dirígete a la página Versiones de App Engine.

    Ir a la página de Versiones

  2. Haz clic en la casilla de verificación junto a la versión de app no predeterminada que deseas borrar.
  3. Haz clic en el botón Borrar en la parte superior de la página para borrar la versión de la app.

Consulta la sección sobre cómo eliminar los recursos facturables en el último paso de este tutorial para obtener más información al respecto.

Información sobre el código

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

Gestión de los envíos de formularios que realizan los usuarios

El formulario para añadir o editar permite que los usuarios puedan agregar y editar presentaciones de libros dentro de la aplicación.

Imagen del formulario de añadir/editar

El formulario HTML se crea mediante Pug, que es un motor de plantillas de Node.js. En la siguiente plantilla de Pug, se 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:

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

Gestión de los envíos de formularios

Cuando un usuario hace clic en Add Book (Añadir libro), el siguiente código de books/crud.js le remite a la página /add de la aplicación, que muestra el formulario para añadir y editar.

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

Cuando el usuario rellena el formulario de Add book (Añadir libro) y hace clic en la opción Save (Guardar), el siguiente código de books/crud.js gestiona la acción HTTP POST del formulario. Esto inicia el proceso de envío de los datos presentados a Cloud Datastore mediante su transferencia a la función model.create.

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-datastore.js contiene el código que realiza las funciones CRUD con los datos almacenados en Cloud Datastore. Por ejemplo, la instrucción model.create llama a la función create de model- datastore.js. Dicha función envía los datos presentados por el usuario a la función update con un valor null como primer parámetro, lo que indica que se trata de un nuevo envío de libros.

module.exports = {
  create,
  read,
  update,
  delete: _delete,
  list
};

Aquí presentamos la función update, que se encarga de guardar los datos enviados por el usuario a Cloud Datastore. Las funciones auxiliares toDatastore y fromDatastore se utilizan para convertir los datos enviados por el usuario del formato de la aplicación al formato de propiedad de entidad ampliada de Cloud Datastore.

function update (id, data, cb) {
  let key;
  if (id) {
    key = ds.key([kind, parseInt(id, 10)]);
  } else {
    key = ds.key(kind);
  }

  const entity = {
    key: key,
    data: toDatastore(data, ['description'])
  };

  ds.save(
    entity,
    (err) => {
      data.id = entity.key.id;
      cb(err, err ? null : data);
    }
  );
}

Después de que los usuarios hayan añadido libros, puedes hacer clic en el enlace de Books (Libros) para acceder a la página /books, que muestra todos los libros almacenados en Cloud Datastore. La página llama al archivo books/model-datastore.js, que inicializa un conjunto de datos de Datastore llamado ds y luego establece la variable kind en Book, que es el tipo de entidad que almacena esta aplicación. Una sola aplicación puede almacenar más de una variable kind en el almacén de datos.

const ds = Datastore({
  projectId: config.get('GCLOUD_PROJECT')
});
const kind = 'Book';

A continuación, la función list se ocupa de mostrar todos los libros a través de los datos recuperados de Cloud Datastore. La instrucción var q = ds.createQuery([kind]) crea una consulta llamada q que seleccionará todos los libros del almacén de datos. Las siguientes propiedades se añaden a la consulta:

  • .limit(limit) establece la cantidad máxima de resultados que se devuelven por página.
  • .order('title') especifica que los resultados deben ordenarse alfabéticamente por título del libro.
  • .start(token) especifica el punto de partida para gestionar la paginación y permite solicitar más páginas en función del valor de token.

Después, la consulta se ejecuta mediante la llamada a ds.runQuery, que toma el objeto de consulta q como la consulta que se ejecutará para su primer parámetro. El segundo parámetro de ds.runQuery es una devolución de llamada que se invoca con (err, books, nextPageToken).

function list (limit, token, cb) {
  const q = ds.createQuery([kind])
    .limit(limit)
    .order('title')
    .start(token);

  ds.runQuery(q, (err, entities, nextQuery) => {
    if (err) {
      cb(err);
      return;
    }
    const hasMore = nextQuery.moreResults !== Datastore.NO_MORE_RESULTS ? nextQuery.endCursor : false;
    cb(null, entities.map(fromDatastore), hasMore);
  });
}
¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...