我的本地Node.js服务器上有一个函数unzip()
,当服务器运行时,它会从AWS CloudFront URL下载.json.gz
文件并将其解压缩到.json
与node app.js
。
在响应路由之前加载该json文件中的帖子 -
app.all('*', function(req, res, next){
fs.readFile('s3posts.json', function(err, data){
res.locals.posts = JSON.parse(data);
next();
});
});
问题是文件在服务器开始运行时被下载并解压缩,并且只要它正在运行就向用户提供相同的数据。除非重新启动服务器,否则不会重新下载该文件。因此,在重新启动之前,不会反映对该数据的任何更改。
我尝试在从json文件读取的unzip()
函数之前调用上面提到的app.all()
路由中的fs.readFile()
函数,但是当我请求任何函数时抛出错误页面 -
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)
当我查看目录时,我看到它下载了文件但无法解压缩。即使下载的文件已损坏,也无法手动解压缩。
注意 - 如果文件位于app.all()
之外,则会下载,解压缩并获得服务。
如何根据用户的每个请求下载和解压缩文件?
答案 0 :(得分:0)
我建议您阅读https://expressjs.com/en/guide/using-middleware.html
中的中间件app.use(函数(请求)...应该帮助您处理所有请求,无论路由如何。
答案 1 :(得分:0)
你应该试试这个,
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();
});
});
答案 2 :(得分:0)
我能够使用request模块执行此操作 -
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();
});
});
这也消除了我需要一个下载并解压缩文件的自定义unzip()
功能。