Tengo una función unzip() en mi servidor Node.js local que descarga un archivo .json.gz de una URL de AWS CloudFront y lo descomprime en .json , cuando el servidor se ejecuta con node app.js
Las publicaciones de ese archivo json se cargan antes de responder a las rutas:
app.all('*', function(req, res, next){ fs.readFile('s3posts.json', function(err, data){ res.locals.posts = JSON.parse(data); next(); }); });El problema es que el archivo se descarga y se descomprime cuando el servidor comienza a ejecutarse, y proporciona los mismos datos al usuario mientras se ejecuta. El archivo no se vuelve a descargar a menos que se reinicie el servidor. Por lo tanto, cualquier cambio en esos datos no se refleja hasta el reinicio.
Intenté llamar a la función unzip() dentro de la ruta app.all() mencionada anteriormente antes de la función fs.readFile() que lee el archivo json, pero arroja un error cuando solicito cualquier página:
undefined:1 undefined ^ SyntaxError: Unexpected token u in JSON at position 0 at JSON.parse (<anonymous>) at ReadFileContext.callback (/Users/Anish/Workspace/NodeJS/unzipper/app.js:48:27) at FSReqWrap.readFileAfterOpen [as oncomplete] (fs.js:359:13)Cuando miro en el directorio, veo que descargó el archivo pero no pudo descomprimirlo. Incluso el archivo descargado está corrupto y no se puede descomprimir manualmente.
NOTA: el archivo se descarga, se descomprime y se sirve bien si se coloca fuera de app.all() .
¿Cómo puedo descargar y descomprimir el archivo en cada solicitud del usuario?
Recomiendo leer sobre middlewares en https://expressjs.com/en/guide/using-middleware.html
app.use(function(request)... debería ayudarlo a manejar todas las solicitudes, independientemente del enrutamiento.
Pude usar el módulo de solicitud para hacer esto:
app.all('*', function(req, res, next) { request({ method: 'GET', uri: 'http://post.s3post.cf/s3posts.json.gz', gzip: true }, function(error, response, body) { res.locals.posts = JSON.parse(body); next(); }); }); Esto también eliminó la necesidad de tener una función de unzip() personalizada que descargó y descomprimió el archivo.
Deberías probar esto,
app.all('*', function(req, res, next){ fs.readFile('http://post.s3post.cf/s3posts.json.gz', function(err, data){ res.locals.posts = JSON.parse(data); next(); }); });