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.

Obtener nuevos datos de la base de datos sqlite al recargar.

Logré obtener datos del sensor en una base de datos sqlite3. Cada 2 minutos aparecen nuevos valores en la base de datos. Ahora quiero mostrarlos con chart.js y por lo tanto hacer uso de sql.js. El código que uso es:

const config_sqljs = {
    locateFile: filename => (
      'https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.5.0/sql-wasm.wasm'
    )
}

const sqlPromise = initSqlJs(config_sqljs)

const dataPromise = fetch(('/sensors.db'))
.then(res => res.arrayBuffer())

Promise.all([sqlPromise, dataPromise])
.then(([SQL, buf]) => {
const db = new SQL.Database(new Uint8Array(buf))
    //const res = db.exec('select time_,temp,humi  from sensors where topic="/x/sensors"')
    const res = db.exec('select time_,temp,humi from sensors where topic ="/y/sensors" and (date="29.11.2021" or date="30.11.2021" or date="01.12.2021");')

    const values = res[0].values;
    let labelx = values.map((arr) => arr[0]);
    let y = values.map((arr) => arr[1]);
    let y2 = values.map((arr) => arr[2]);
})

Funciona bien al principio, pero luego me di cuenta de que los valores en los arrays labelx, y y y2 no son los más recientes, están atrasados, aproximadamente medio día. Los nuevos valores siempre aparecen en la base de datos. Creo que tiene que ver algo con Promise.all() y .then() pero desafortunadamente no sé mucho acerca de js. El código se ejecuta cada vez que la página se carga o recarga, incluso si uso Strg + F5 para forzar una carga completa y sin caché, sigue siendo el mismo. ¿Puedes ayudarme? ¡Gracias!

=== EDIT ===

Adapté tu sugerencia:

const dataPromise = fetch(('/db.db', {
    method: "GET",
    "cache-control": "no-store"}
))
.then(res => res.arrayBuffer())'

Lamentablemente, obtengo el error:

“Uncaught (en la promesa) Error: el archivo no es una base de datos”

La línea relevante es:

const res = db.exec('select x from db;')
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en la conexión de la base de datos.

    Mencionaste que siempre aparecen valores nuevos en la base de datos, por lo que es posible que el archivo de la base de datos esté siendo almacenado en caché por el navegador, lo que explica por qué no estás obteniendo los valores más recientes.

    Para solucionar esto, puedes agregar una cabecera de control de caché a tu solicitud de búsqueda para evitar el almacenamiento en caché. Reemplaza el código dataPromise existente por el siguiente:

    const dataPromise = fetch('/sensors.db', {
      method: 'GET',
      headers: {
        'Cache-Control': 'no-cache, no-store, must-revalidate',
        'Pragma': 'no-cache',
        'Expires': '0'
      }
    })
    .then(res => res.arrayBuffer())
    

    Esto debería obligar al navegador a buscar siempre la versión más reciente de la base de datos.

    Con respecto al error el archivo no es una base de datos, es posible que el archivo de la base de datos en sí esté corrupto o que no esté en el formato esperado. Puede intentar abrir el archivo de la base de datos directamente con un editor de SQLite para ver si es válido.

    Si aún tienes problemas, házmelo saber y puedo intentar ayudarte a solucionarlos.

Comments are closed.