Executando verificação de segurança...
1

[AJUDA]Socorro nunca vi isso numa api (Node.JS)

Pessoal, tô tendo um problema na api quando está tendo requests simultâneas e tô tentando encontrar o motivo do problema e uma solução... Tenho uma rota que recebe id e value, essa rota faz um insert usando o id e o value recebido. Acontece que se o usuário A enviar (id:1, value:"A") e o usuário B enviar (id:2,value:"B") simultaneamente a api está misturando tudo por ex: (id:1,value:"A","B") (id:2,value:)... Alguém sabe o que pode ser? Ou alguma ideia pelo menos pra eu pesquisar...

A principio imaginei que fosse algum problema de concorrencia, parece que a api quando recebe uma requisição só funciona normalmente as proximas quando responde a anterior, como se ela tivesse que ser exclusiva para cada usuário, com muitos acessos alguns inserts e updates não estão acontecendo, estão se perdendo, isso não acontece com poucos usuários

Carregando publicação patrocinada...
1

Precisamos de mais dados para ser mais certeiro, mas um palpite: você pode talvez estar guardando valores num objeto que foi declarado num escopo acima.

Lembro que a primeira vez que programei com Node.js (vindo do PHP), eu não contava que a instância/processo do Node.js ficava vivo, e comecei a compartilhar a sessão entre usuários, pois justamente eu definia ela num escopo acima (no caso, era o escopo global).

1

O controller que é executado na rota que está dando o erro é bem básico ele simplesmente cria uma linha em um banco de dados usando Sequelize, não estou usando variáveis fora do escopo, o que me deixou bem cabreiro é que a requisição recebe um id e a api meio que "confunde" os ids com muitos acessos, eu simulei com com 1, 2, 3 usuários simultâneos e não aconteceu de novo, eu não sei dizer se o problema é na api, no banco, no app ou no server...

O escopo do projeto é basicamente esse:

App -> React Native/Expo
Api -> Node.JS/ REST
BD -> Postgress

RESUMO:
No app existem formulários que estão em uma tabela 'forms', cada formulário tem um 'id_form' e um status ('WAITING'|'COMPLETED'). Existe tambem uma tabela de questões, e cada questão tem um titulo, um tipo ('INPUT','IMAGE','RADIO' etc), e cada questão tem um id_form que é a referencia ao formulário dono da questão, existem tambem as tabelas de ResponseImage, ResponseText e ResponseAlternative que são para guardar as respostas para cada questão e cada resposta referencia um id_question ligando a questão que por sua vez referencia um formulário.

PROBLEMA:
O que aconteceu foi que em um momento 30 usuários em uma sala responderam alguns formulários, todos os formulários tinham as memas perguntas (titulo das perguntas) porém não eram os mesmos formulários pois cada ums tinham um id_form diferente, com id_questions diferentes e etc. Todos eles responderam o formulários por completo, ao fim do processo quando fui analizar os resultados, a resposta de algumas questões estavam vazias, alguns formulários ficaram em branco e algumas respostas estavam trocadas entre questões sendo que cada questão tem um formulário dono mas cada usuário iniciou em seu próprio formulário.

Um exemplo do código da rota que ocorrou o problema:


  async answereImage(req, res) {
    const { id_question, description } = req.body;

    if (!id_question) {
      return res.status(200).json({});
    }

    try {

      const filename = req.file.filename;

      const answerQuestion = await ResponseImage.create({
        id_question: Number(id_question),
        filename: filename,
        description: description,
      });

      return res.status(200).json(answerQuestion);
    } catch (error) {
      console.log(error)
      res.status(500).send(error)
    }

  }

Não sei se expliquei bem o caso de uso, está complexo demais pra minha cabeça, qualquer ajuda é bem vinda, qualquer duvida que for pra ajudar a resolver pode perguntar só quero entender oq está acontecendo kkkkk cada k é uma lagrima

1

Aparentemente o método create está mesclando os objetos quando a sessão é sobrescrita em múltiplos requests. Como você está carregando um arquivo, isso toma tempo e pelo método da controller ser async ele é executado em ordem diferente no Event Loop (pois retorna uma Promise).
O primeiro passo que recomendo tu fazer é tentar escrever um teste unitário que permita simular esse cenário. Só aí tu vai ter uma melhor "fotografia" do problema.
Se você conseguir relacionar o que comentei com os resultados do teste, talvez tu consiga resolver usando alguma abordagem que te permita isolar as transações, como executá-las em um Job, por exemplo.
Ps: O código acima não me parece ser o problema, mas pela sua explicação, me parece que sua descrição de regra de negócio indica manipulação de estado do formulário nas camadas superiores, e imagino que isso possa ser um sintoma do problema. Mas precisaria ter acesso ao código pra entender o problema melhor.

1
1

Coloca um UUID4 ao gerar cada requisição para debug/retorno, isso ira te ajudar a mapear onde pode estar o problema, ou posta o codigo aqui