Reading & Writing Databases for Strapi.
Se trata de configurar Strapi V5 para utilizar dos bases de datos diferentes: una para lectura y otra para escritura. Esto permite tener una separación clara entre las operaciones de consulta y modificación en la base de datos.
Configuración General
- config/middlewares.ts
- config/database.ts
- src/middlewares/databaseRouter.ts
Configuración de la base de datos
En config/database.ts, se ha cambiado el host para permitir escribir tablas al inicio del proyecto:
...host: env('DATABASE_HOST_WRITING', 'localhost'),...Esta configuración permite que Strapi escriba tablas al inicio del proyecto en la base de datos de escritura.
Configuración del Router de Base de Datos.
En src/middlewares/databaseRouter.ts, se ha creado un middleware personalizado para manejar las conexiones a la base de datos:
import { Next, Context } from 'koa'import mysql from 'mysql2/promise'import { env } from 'process'
export default (config, { strapi }) => {
return async ( ctx: Context, next: Next ) => {
// Configuración de la pool para lecturas const poolRead = mysql.createPool({ host: process.env.DATABASE_HOST_READING, port: parseInt(process.env.DATABASE_PORT), database: process.env.DATABASE_NAME, user: process.env.DATABASE_USERNAME, password: process.env.DATABASE_PASSWORD, })
// Configuración de la pool para escrituras const poolWrite = mysql.createPool({ host: process.env.DATABASE_HOST_WRITING, port: parseInt(process.env.DATABASE_PORT), database: process.env.DATABASE_NAME, user: process.env.DATABASE_USERNAME, password: process.env.DATABASE_PASSWORD, })
const isWriteOperation = ['POST', 'PUT', 'DELETE'].includes(ctx.method)
console.log('**********'); ctx.dbConfig = isWriteOperation ? poolWrite : poolRead console.log(`Operación: ${ctx.method} - Base de datos: ${isWriteOperation ? 'Escritura (DATABASE_HOST2)' : 'Lectura (DATABASE_HOST1)'}`);
await next() }}Este middleware personalizado realiza lo siguiente:
- Crea dos pools de conexión: uno para lectura y otro para escritura.
- Determina si la operación es una escritura basándose en el método HTTP.
- Asigna la pool correspondiente dependiendo del contexto del middleware.
Funcionamiento
Cuando una solicitud llega al servidor Strapi, este middleware se ejecuta primero. Dependiendo del método de la solicitud (GET, POST, PUT, DELETE), se selecciona el pool de conexión adecuado.
Para operaciones de lectura (GET):
- Se utiliza poolRead para realizar consultas a la base de datos de lectura.
Para operaciones de escritura (POST, PUT, DELETE):
- Se utiliza poolWrite para realizar modificaciones en la base de datos de escritura.