2 votes

Impossible de faire patienter res.redirect

Voici un exemple de backend pour une méthode de post pour mettre à jour un blog sur lequel je travaille :

app.post('/blogUpdate', checkAuthenticated, async (req, res) => {

  try {

    const newContent = req.body.blogInput
    const template = '<p>' + newContent.replace(/\n{2,}/g, '</p><p>').replace(/\n/g, '<br>') + '</p>'
    const newDate = Date.now().toString() 
    const postDate = req.body.date       

    db.getConnection( async (err, connection) => {

      if (err) throw (err)

      const contentUpdate = "UPDATE post SET content = ? WHERE date = ?" 
      const dateUpdate = "UPDATE post SET updatedDate = ? WHERE date = ?"
      const blogContentUpdate = mysql.format(contentUpdate, [template, postDate])
      const blogDateUpdate = mysql.format(dateUpdate, [newDate, postDate])

      await connection.query (blogContentUpdate, (err, _result)=> {

        if (err) throw (err)

       })

      await connection.query (blogDateUpdate, (err, _result)=> {

        connection.release()
        if (err) throw (err)

       })

     })

    res.redirect('/blog')

  } catch {

  res.redirect('/blogInput')

  }

})

Dans ce cas, je capture les modifications (req.body.blogInput) apportées à un blog existant en sélectionnant la date de publication originale (une valeur UNIX unique garantie qui n'est jamais modifiée, c'est-à-dire postDate), en la convertissant en html (modèle), en stockant le nouveau contenu modélisé dans une base de données avec une nouvelle date de mise à jour (newDate, qui est placée dans un champ de table SQL différent de la postDate originale), puis en redirigeant vers une page accessible au public qui affiche les blogs. Cependant, la redirection est trop rapide et les modifications n'apparaissent pas au chargement. En d'autres termes, l'ancien contenu du blog est affiché. Un rafraîchissement rapide montre toujours les modifications qui viennent d'être apportées. Comment puis-je retarder la redirection de sorte que les modifications soient visibles au chargement de la page de redirection ?

0voto

Je clos cette demande. J'ai réussi à le faire fonctionner parfaitement avec une simple promesse.

 app.post('/blogUpdate', checkAuthenticated, async (req, res) => {

      try {

        const newContent = req.body.blogInput
        const template = '<p>' + newContent.replace(/\n{2,}/g, '</p><p>').replace(/\n/g, '<br>') + '</p>'
        const newDate = Date.now().toString() 
        const postDate = req.body.date       

        **await new Promise** ((resolve, reject) => {

          db.getConnection( async (err, connection) => {

          if (err) reject(err)

          const contentUpdate = "UPDATE post SET content = ? WHERE date = ?" 
          const dateUpdate = "UPDATE post SET updatedDate = ? WHERE date = ?"
          const blogContentUpdate = mysql.format(contentUpdate, [template, postDate])
          const blogDateUpdate = mysql.format(dateUpdate, [newDate, postDate])

          connection.query (blogContentUpdate, (err, result)=> {

            if (err) reject(err)

            return **resolve(result)**
           })

          connection.query (blogDateUpdate, (err, result)=> {

            connection.release()

            if (err) reject(err)

            return **resolve(result)**

           })

         })

        })

        res.redirect('/blog') 

      } catch {

      res.redirect('/blogInput')

      }

    })

En attendant les résultats résolus, j'ai pu faire attendre la fonction res.redirect. Lors de la redirection, les modifications apportées à mes messages étaient immédiatement visibles au lieu de devoir recharger la page redirigée après la redirection.

-1voto

jacobkim Points 574

Le problème est que la méthode db est attendue mais que la redirection est déjà exécutée. Ainsi, la redirection s'exécute après l'attente de la méthode db.

app.post('/blogUpdate', checkAuthenticated, async (req, res) => {

  try {

    const newContent = req.body.blogInput
    const template = '<p>' + newContent.replace(/\n{2,}/g, '</p><p>').replace(/\n/g, '<br>') + '</p>'
    const newDate = Date.now().toString() 
    const postDate = req.body.date       

// ----------- from this -----------------------//
    db.getConnection( async (err, connection) => {

      if (err) throw (err)

      const contentUpdate = "UPDATE post SET content = ? WHERE date = ?" 
      const dateUpdate = "UPDATE post SET updatedDate = ? WHERE date = ?"
      const blogContentUpdate = mysql.format(contentUpdate, [template, postDate])
      const blogDateUpdate = mysql.format(dateUpdate, [newDate, postDate])

      await connection.query (blogContentUpdate, (err, _result)=> {

        if (err) throw (err)

       })

      await connection.query (blogDateUpdate, (err, _result)=> {

        connection.release()
        if (err) throw (err)

       })

     })
// ---------- till this executing --------------
    res.redirect('/blog') // but this executed while above method executing.

  } catch {

  res.redirect('/blogInput')

  }

})

app.post('/blogUpdate', checkAuthenticated, async (req, res) => {

  try {

    const newContent = req.body.blogInput
    const template = '<p>' + newContent.replace(/\n{2,}/g, '</p><p>').replace(/\n/g, '<br>') + '</p>'
    const newDate = Date.now().toString() 
    const postDate = req.body.date       

// ----------- add await -----------------------//
   await db.getConnection( async (err, connection) => {

      if (err) throw (err)

      const contentUpdate = "UPDATE post SET content = ? WHERE date = ?" 
      const dateUpdate = "UPDATE post SET updatedDate = ? WHERE date = ?"
      const blogContentUpdate = mysql.format(contentUpdate, [template, postDate])
      const blogDateUpdate = mysql.format(dateUpdate, [newDate, postDate])

      await connection.query (blogContentUpdate, (err, _result)=> {

        if (err) throw (err)

       })

      await connection.query (blogDateUpdate, (err, _result)=> {

        connection.release()
        if (err) throw (err)

       })

     })
// add await then after db, redirect method executing
  .then(() =>res.redirect('/blog'))
// ---------- --------------
    //res.redirect('/blog') // delete this

  } catch {

  res.redirect('/blogInput')

  }

})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X