es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo actualizar una página al extraer datos de una base de datos de PostgreSQL alojada

Estoy construyendo un proyecto de react nextjs, desplegado en Vercel, que utiliza Prisma y una base de datos de postgresql alojada en Heroku. Estoy siguiendo este tutorial: https://vercel.com/guides/nextjs-prisma-postgres.

Cuando actualizo la base de datos (creando un nuevo post) NO se actualizan los posts que se muestran en la pantalla.

Lo extraño es que funciona como se espera (actualiza el feed de posts) cuando se ejecuta en “localhost”.

Actualizar la página NO actualiza los posts de la página… Pero volver a desplegar la misma compilación en vercel sí actualiza los posts de la página.

“Localhost” y la aplicación desplegada utilizan la misma instancia de la base de datos de Heroku.

Aquí está la página que lista los Posts.

“`typescript
export const getStaticProps: GetStaticProps = async () => {
const feed = await prisma.post.findMany({
include: {
author: {
select: {
name: true,
},
},
},
})
return {
props: { feed },
}
}

type Props = {
feed: PostProps[]
}

const Blog: React.FC<props> = ({ feed = [] }) => {
const router = useRouter()

const refreshData = () => {
router.replace(router.asPath)
}

useEffect(() => {
// Agregué esto para intentar refrescar la página
refreshData()
}, [])

return (
<main>
{feed.map((post) => (
<div key="{post.id}" classname="post">
<post post="{post}"></post>
</div>
))}
</main>
)
}

export default Blog
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una posible razón para el problema es que los datos están siendo almacenados en caché por Vercel, lo cual evita que se actualicen en la pantalla. Cuando despliegas la versión actualizada, Vercel borra la caché y muestra los nuevos datos.

    Para resolver este problema, puedes intentar los siguientes pasos:

    1. Desactiva la caché en Vercel agregando el siguiente código al archivo vercel.json:
      {
       "version": 2,
       "builds": [{ "src": "next.config.js", "use": "@vercel/next" }],
       "routes": [
         {
           "src": "/(.*)",
           "headers": {
             "Cache-Control": "no-cache, no-store, max-age=0, must-revalidate"
           },
           "dest": "/"
         }
       ]
      }
      
    2. Modifica la función getStaticProps para incluir la propiedad revalidate:
      export const getStaticProps: GetStaticProps = async () => {
       const feed = await prisma.post.findMany({
         include: {
           author: {
             select: {
               name: true,
             },
           },
         },
       })
       return {
         props: { feed },
         revalidate: 1, // agregar esta línea para refrescar los datos
       }
      }
      

    Con estos cambios, Vercel no almacenará en caché los datos y actualizará la página cada segundo. Si deseas cambiar la frecuencia de actualización, puedes modificar el valor de revalidate en consecuencia.

Comments are closed.