Express.js - 在每个HTTP请求上执行函数

时间:2017-04-06 18:02:30

标签: javascript json node.js express

我的本​​地Node.js服务器上有一个函数unzip(),当服务器运行时,它会从AWS CloudFront URL下载.json.gz文件并将其解压缩到.jsonnode 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()之外,则会下载,解压缩并获得服务。

如何根据用户的每个请求下载和解压缩文件?

3 个答案:

答案 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()功能。