Estoy trabajando en un servidor de imágenes local simple que proporciona imágenes a una aplicación web con algo de JSON. La aplicación web tiene una paginación que realizará una solicitud de obtención "/images?page=X&limit&200" a un servidor express.js que devuelve los archivos JSON en una sola matriz. Quiero aprovechar el almacenamiento en caché interno del navegador de modo que si un usuario va a una página anterior, express.js devuelve un ETAG. Me preguntaba cómo podría lograrse esto con express.js. Para esta aplicación, realmente solo quiero que el cálculo de ETAG tome en tres parámetros la página, el directorio y el límite (no es necesario considerar todo el cuerpo JSON). Además, esta aplicación es solo para uso local, por lo que quiero que el servidor haga el trabajo pesado, ya que pensé que sería más rápido que el navegador. Vi https://www.npmjs.com/package/etag que parece prometedor, pero no estoy seguro de cómo usarlo con express.js
Aquí hay un modelo del código express.js que tengo a continuación:
var express = require('express'); var app = express(); var fs = require('fs'); app.get('/', async (req, res) =>{ let files = []; let directory = fs.readdirSync("mypath"); let page = parseInt(req.query.page); let limit = parseInt(req.query.limit); for (let i = 0; i < limit; ++i) { files.push(new Promise((resolve) => { fs.readFile(files[i + page * limit].name, (err, data) => { // format the data so easy to use for UI resolve(JSON.parse(data)); }); }); } let results = await Promise.all(files); // compute an etag here and attach it the results. res.send(results); }); app.listen(3000);Cuando su servidor envía una ETag al cliente, también debe estar preparado para verificar la ETag que el cliente devuelve al servidor en el encabezado If-None-Match en una solicitud "condicional" posterior.
Si coincide, el servidor responderá con el estado 304 ; de lo contrario, no hay ningún beneficio en el uso de ETags.
var serverEtag = "<compute from page, directory and limit>"; var clientEtag = req.get("If-None-Match"); if (clientEtag === serverEtag) res.status(304).end(); else { // Your code from above res.set("ETag", serverEtag); res.send(results); } El cálculo de serverEtag podría basarse en la hora de la última modificación en el directorio, de modo que cambie cada vez que cambie cualquiera de las imágenes en ese directorio. Es importante destacar que esto podría hacerse sin llevar a cabo las instrucciones fs.readFile de su código.