Sequelize es un ORM para Nodejs que te permite agilizar el desarrollo de aplicaciones que incluyen la conexión con bases de datos relacionales como Postgres, MySQL, MariaDB, SQLite y SQL Server.
De MySQL Community Downloads, descargue e instale:
Desde la línea de comandos, en la raíz de la carpeta del proyecto.
Instale Sequelize CLI de forma global, con:
npm install -g sequelize-cli
  Instale Sequelize y el conector para MySQL para el proyecto, con:
npm install --save sequelize mysql2
  Genere los archivos de configuración de Sequelize, con:
sequelize init
    config/config.json contiene la configuración para la conexión con la base de datos relacional.models contendrá las clases correspondientes a las entidades de la base de datos relacional.migrations contendrá los scripts a ejecutar en la base de datos relacional y en la aplicación. Estos scripts actúan como registros históricos de los cambios.seeders contendrá los scripts para generar datos para las entidades de la base datos relacional.
  
Modifique el archivo config/config.json con los datos para la conexión con el motor de bases de datos. En este caso, el ambiente a utilizar es development.
{
  "development": {
    "username": "root",
    "password": "root",
    "database": "album",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  ...
  El modelo es una representación abstracta, mediante clases (atributos y métodos), de las entidades de la base de datos relacional.
Desde la línea de comandos, en la raíz de la carpeta del proyecto.
Cree el modelo foto, con:
sequelize model:create --name foto --attributes titulo:string,descripcion:string,calificacion:float,ruta:string
    models se agregó la clase foto.js, con la configuración predeterminada para la clase foto con los atributos especificados.migrations se agregó el script YYYYMMDDHHMMSS-create-foto.js para crear la tabla en la base de datos.
  
Las migraciones contienen un registro histórico de los cambios realizados en los modelos y/o entidades.
Desde la línea de comandos, en la raíz de la carpeta del proyecto.
Ejecute TODAS las migraciones, con:
sequelize db:migrate
    
     
  
  
A veces, es necesario generar datos de manera automática.
Desde la línea de comandos, en la raíz de la carpeta del proyecto.
sequelize seed:generate --name fotosseeders/YYYYMMDDHHMMSS-fotos.js,
    
...  
async up (queryInterface, Sequelize) {
  
  for (let i = 0; i <10; i++) {  
      await queryInterface.bulkInsert('fotos', [{  
          titulo: 'fotos'+i,  
          descripcion: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
          calificacion: (Math.random()*10).toFixed(2),  
          ruta: 'public/images/'+'fotos'+i+'.png',
          createdAt: new Date(),  
          updatedAt: new Date()  
      }], {});  
   } 
    
},  
...
...  
async down (queryInterface, Sequelize) {
  
  await queryInterface.bulkDelete('fotos', null, {});  
  
},  
...
sequelize db:seed --seed YYYYMMDDHHMMSS-fotossequelize db:seed:allsequelize db:seed:undo:allRevise los cambios en la base de datos.
  
Para solicitar los datos desde la base de datos, será necesario que:
var express = require('express');
var router = express.Router();
module.exports = router;
var express = require('express');  
var router = express.Router();  
  
const Sequelize = require('sequelize');
const Foto = require('../models').foto;  
  
module.exports = router;
"/findAll/json". El cual, responde con todas las fotos (findAll) que se encuentran en la tabla renderizados en un json.
...
const Foto = require('../models').foto;
router.get('/findAll/json', function(req, res, next) {  
	
  Foto.findAll({  
      attributes: { exclude: ["updatedAt"] }  
  })  
  .then(fotos => {  
      res.json(fotos);  
  })  
  .catch(error => res.status(400).send(error)) 
});
module.exports = router;
"/findAll/view". El cual, responde con todas las fotos (findAll) que se encuentran en la tabla renderizados en la vista html.
...
router.get('/findAll/view', function(req, res, next) {  
  
  Foto.findAll({  
      attributes: { exclude: ["updatedAt"] }  
  })  
  .then(fotos => {  
      res.render('fotos', { title: 'Fotos', arrFotos: fotos });  
  })  
  .catch(error => res.status(400).send(error)) 
});
module.exports = router;
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
  </head>
  <body>
      
    ...
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/feather-icons@4.28.0/dist/feather.min.js" integrity="sha384-uO3SXW5IuS1ZpFPKugNNWqTZRRglnUJK6UAZ/gxOX80nxEkN9NcGZTftn6RzhGWE" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.4/dist/Chart.min.js" integrity="sha384-zNy6FEbO50N+Cg5wap8IKA4M/ZnLJgzc6w2NqACZaK0u0FXfOWRRJOnQtpZun8ha" crossorigin="anonymous"></script>
  </body>
</html>
...  
  
<div class="container-fluid p-4">
  <h1 class="pb-4"><%= title %></h1>
  <table class="table table-striped table-hover">
    <thead>
      <tr>
        <th>Id</th>
        <th>Título</th>
        <th>Descripción</th>
        <th>Ruta</th>
        <th>Fecha de creación</th>
      </tr>
    </thead>
    <tbody>
      <% arrFotos.forEach((foto) => { %>
      <tr>
        <td><%= foto.id %></td>
        <td><%= foto.titulo %></td>
        <td><%= foto.descripcion %></td>
        <td><%= foto.ruta %></td>
        <td><%= foto.createdAt.toLocaleDateString('en-US') %></td>
      </tr>
      <% }); %>
    </tbody>
  </table>
</div> 
  
...
...
var fotosRouter = require('./routes/fotos');
...
...
app.use('/fotos', fotosRouter);
...
http://localhost:3000/fotos/findAll/json
  
http://localhost:3000/fotos/findAll/view