heroku中的后端重复插入/heroku中的前端重复请求(我不知道)

inb24sb2  于 2022-12-23  发布在  其他
关注(0)|答案(2)|浏览(118)

我在heroku运行了一个应用程序,前后分开
背面:x1个月1x + x1个月1n1x + x1个月2个月1x
正面:vue
应用程序工作正常,但我有一个随机错误:有时我有重复的记录从前端插入。(我猜错误来自前端)
从前端使用fetch添加记录

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);

正确插入记录,但有时会重复插入正确的下一个ID
在某些情况下,fetch是否会发送2个请求?
在本地计算机上部署heroku之前,我从不复制记录
我已经找了好几天了,我不知道为什么会这样

qyyhg6bp

qyyhg6bp1#

是的,这是可能的,你正在发送2个请求的地方。把日志在heroku回特定的端点,看看到底发生了什么。同时,从前端请求检查您的网络选项卡中的开发工具,看看你是否真的发射请求两次。因为正如你所说,重复的记录,但他们有正确的ID的,只能意味着你所说的。
此外,这可能是真的,也可能不是真的,但heroku服务器在不活动时休眠,因此可能会导致问题,但我不完全确定,将不得不检查代码和环境。

jvlzgdj9

jvlzgdj92#

查看heroku(背面)日志,看起来像是正常插入了2条记录
查看浏览器中的网络选项卡,只显示1个请求:选件(204)和立柱(200)
该表的ID是主键没有什么复杂的
另一方面,我在一个Dynos爱好计划,没有睡眠时间(如果免费的)
在此放置部分或后端
database.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 pool

controller.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")
    }

}

这可能是一个获取问题吗?例如,不要尝试使用axios

相关问题