Search code examples
javascriptasync-awaites6-promise

Async\Await with promise not working properly


I have an Async function and I send to another Async function that wait for the promise to resolve, but for some reason its not waiting for the reslove.

Router.get("/openPage/:id",async(res,req)=>{
  var parms = res.getHeaderParamas();
  let select = OpenTemplate(parms);
  let theResualt = await select.then(data=>data);
  connection.end();
  res.returnJson(theResualt,"Success");
});


  async function OpenTemplate(header){
    return new Promise(res=>{
      var query = `SELECT * FROM streamingpages WHERE ID=${header.routerParamas.id}`;
      connection.connect((err)=>{res(err)});
      connection.query(query,(error, results, fields)=>{
          if(error) res(error)
          console.log(results);
          res(results);
      });
    })

}

I dont understand what am I doing wrong??


Solution

  • In this line:

     connection.connect((err)=>{res(err)});
    

    You resolve the promise when the connection was established, not when the query was done. You can't resolve a Promise more than once.

     function makeQuery(connection, query) {
      return new Promise((resolve, reject) => {
        connection.connect(error => {
          if(error) return reject(error);
          connection.query(query, (error, results, fields) => {
            if(error) return reject(error);
    
            console.log(results);
            resolve(results);
    
            connection.close(); // actually you should open the connection to the db once ...
          });
        });
      });
    }
    
    const openTemplate = header =>
      makeQuery(connection, `SELECT * FROM streamingpages WHERE ID=${header.routerParamas.id}`); // MYSQL INJECTION POSSIBLE!!!!
    
    Router.get("/openPage/:id",async(res,req)=>{
     var params = res.getHeaderParams();
     const result = await openTemplate(parms);
     res.returnJson(result, "Success");
    });