Search code examples
javascriptnode.jspostgresqlsequelize.jssequelize-cli

Sequelize delete query runs, but does not resolve Promise


I have a node js server that is creating and deleting from database using Sequelize. When i create new user in "Users" table, query normally runs and server returns response. But when i try to delete user from "Users" table, query runs but promise isn't resolved, therefore i get no response from server. Here is my code:

const { User } = require("./models")
const user = {id: "...."} //Parsed delete request from client, id is not undefined  
User.destroy({
      where: {
        id: user.id,
      },
    })
      .then(res.status(200).clearCookie("refresh-token"));
      .catch(res.status(400));

What i see in console:

Executing (default): DELETE FROM "Users" WHERE "id" = '6d3edbab-03b8-429b-b249-a9d3ba6bce7a'

And after a while:

DELETE /api/user/delete - - - - ms [2021-3-14 14:17:11]

I delete stuff from other tables too and they work, so it seems that Users table is somewhat special. Whats wierd is that when i look in database i see that record was deleted. I have no idea what is happening.

Thanks for help!


Solution

  • I solved my issue by creating a new function that opens a new Sequelize connection and uses that to delete records in db. Here it is:

    function deleteUsr(id, res) {
      const { Sequelize } = require("sequelize");
    
      if (!/^([0-9a-z]){8}-([0-9a-z]){4}-([0-9a-z]){4}-([0-9a-z]){4}-([0-9a-z]){12}$/.test(id)) {
        res.status(400).send("Provide valid UUID")
      }
      const seq = new Sequelize(
        "connection string"
      );
    
      seq
        .authenticate()
        .then(console.log("yipeee"))
        .catch(err => console.error(err));
    
      seq
        .query(`delete from "Users" where id='${id}'`)
        .then(x => {
          res.status(200).clearCookie("refresh-token").send(x);
          seq.close();
        })
        .catch(err => {
          res.status(400).send(err);
          seq.close();
        });
    }
    

    Avoid using this function if your input isn't sanitized properly, because anyone who is signed could delete any user if using this. I am taking uuid from verified jwt access token and comparing it to encrypted refresh token, so that user cannot even input anything into the function. Hope it helped!