2017-04-06 175 views
0

我有我的本地的Node.js服務器上的功能unzip()是從下載的AWS CloudFront URL一個.json.gz文件,並將其解壓到.json,當服務器與node app.js運行執行功能。Express.js - 對每個HTTP請求

從JSON文件中的帖子迴應的路線之前加載 -

app.all('*', function(req, res, next){ 
    fs.readFile('s3posts.json', function(err, data){ 
     res.locals.posts = JSON.parse(data); 
     next(); 
    }); 
}); 

的問題是,該文件被下載並解壓當服務器開始運行,並提供相同的數據給用戶只要因爲它正在運行。除非重新啓動服務器,否則不會重新下載該文件。所以,對該數據的任何更改都不會反映出來,直到重新啓動。

我已經打過電話的上述fs.readFile()功能從JSON文件中讀取之前app.all()路線內unzip()功能,但是當我請求任何頁面拋出一​​個錯誤 -

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

我能夠使用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()函數下載和解壓縮文件。根據您的建議

0

我建議在https://expressjs.com/en/guide/using-middleware.html

app.use(函數(請求)閱讀有關中間件...應該幫你處理,不管路由所有請求。

+0

,我嘗試使用 - 'app.use(功能(REQ){ \t解壓縮(); });' @eavichay的文件下載並解壓縮成功,但我的網頁沒有被送達。瀏覽器只是在等待。我嘗試使用'next'參數並在'unzip()'之後放置'next()'函數,但是我收到錯誤 - TypeError:next不是函數。任何想法爲什麼? –

+0

你應該調用next()回調。中間件完全按照你想要的來傳遞請求。該函數獲取請求,響應和下一個回調參數,如果希望服務器繼續處理請求,則應使用next,如果要刪除請求,則使用next(false)。 – eavichay

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(); 
    }); 
});