Tengo una aplicación en heroku, separada por atrás y por delante.
atrás: node + express + mysql
frente: vue
la aplicación funciona bien, pero tengo un error aleatorio: a veces tengo registros duplicados insertados desde la interfaz. (Supongo que el error viene del frente)
desde la interfaz utilizo fetch para agregar los registros
const requestOptions = { method: "POST", headers: { "Accept": "application/json", "Content-Type": "application/json" }, body: JSON.stringify({ data: data, ...: ..., }), }; const response = await fetch(`url_backend_heroku/api/add`, requestOptions); los registros se insertan correctamente, pero a veces se insertan duplicados con la siguiente identificación correcta
¿Podría ser que fetch esté enviando 2 solicitudes en algunos casos?
antes de implementar en heroku en mi máquina local, nunca duplico registros
Llevo dias dando vueltas y no encuentro por que pasa esto
Sí, es posible que estés enviando 2 solicitudes a alguna parte. Ponga registros en heroku ATRÁS en el punto final específico para ver qué está sucediendo exactamente. Además, mientras realiza la solicitud desde el front-end, verifique la pestaña de su red en las herramientas de desarrollador para ver si realmente está activando la solicitud dos veces. Porque como dijiste registros duplicados pero tienen identificaciones correctas, solo podría significar lo que dijiste.
Además, esto puede ser cierto o no, pero el servidor de heroku duerme por inactividad, por lo que es posible que cause un problema, pero no estoy completamente seguro de eso, tendré que verificar el código y el entorno para eso.
mirando el registro de heroku (atrás) parece que se insertaron 2 registros normalmente
mirando la pestaña de red en el navegador, solo aparece 1 solicitud: OPCIONES (204) y POST (200)
la tabla tiene un id que es la llave primaria nada complicado
por otro lado estoy en un plan Dynos Hobby que no tiene tiempos de sueño (si es gratis)
poner aquí parte o mi backend
base de datos.js
const mysql = require('mysql') const { promisify } = require('util') const config = { database keys } const pool = mysql.createPool(config); pool.getConnection((err: any, connection: any) => { if (err) { if (err.code === 'PROTOCOL_CONNECTION_LOST') { console.error('DATABASE CONNECTION WAS CLOSED') } if (err.code === 'ER_CON_COUNT_ERROR') { console.error('DATABASE HAS TO MANY CONNECTIONS') } if (err.code === 'ECONNREFUSED') { console.error('DATABASE CONNECTION WAS REFUSED') } } if (connection) connection.release() console.log('DB is Connected') return }) pool.query = promisify(pool.query) export default poolcontrolador.js
import pool from '../database'; public async insert(req: Request, res: Response) { let body = req.body try { const response = await pool.query('SELECT MAX(id) + 1 as idNew FROM table') let data = {Id: response[0].idNew, ...body} //before it had an auto_increment id and it also failed const result = await pool.query('INSERT INTO table set ?', [data]) res.json({ insertId: response[0].idNew, message: "Saved OK" }) } catch (error) { console.log("error", error) return res.status(500).send("error") } }¿Puede ser un problema de recuperación? no intentes usar axios por ejemplo