2016-11-27 47 views
2

我想在Express中爲用戶特定的靜態內容提供服務。這意味着,如果用戶登錄,他的私人靜態文件夾將以快遞服務。其他用戶不得訪問。如何在Express.js中提供用戶特定的靜態內容

我嘗試了以下(見下文),但靜態內容沒有被服務。實際上,這條路線似乎完全被忽略了,我得到了一條404.

我不確定我做這件事的方式是否正確,如果express能夠動態地提供不同的靜態文件夾。預先感謝您對此的看法。

下面的代碼(簡化):

routes.js:

express = require 'express' 
router = express.Router() 

router.use '/user/assets', (req, res, next) -> 
    if req.user 
     userpath = 'uploads/' + md5(req.user._id) 
     if not fs.existsSync userpath 
      fs.mkdirSync userpath 
      console.log "Created user directory at " + userpath 

     express.static(userpath) 
    next() 

module.exports = router 

index.js:

express = require 'express' 
app = express() 
app.use '/', require './routes' 

圖片的標題說明

的MD5是隻是一種逃避用戶標識中奇怪字符的方式,這是一個字符串。我知道有一種錯配的可能性,這種錯配很小,而我現在不想關心這種錯配。對解決嘗試時尚的一般安全性的擔憂值得讚賞。代碼是用CoffeeScript編寫的。

req.user包含有效的用戶元素。

回答

3

只要撥打express.static是不夠的,你需要use()它與路由器。不幸的是,你不能直接做到這一點,因爲你需要爲每個用戶提供一組不同的路線。

調用express.static將返回中間件功能。您可以直接調用它,即是這樣的:

var files = express.static(userpath); 
return files(req, res, next); 

但是這仍然不夠,因爲中間件使用req.url建立的文件路徑。快速路由器調整此屬性並刪除掛載點(請參閱文檔中的req.originalUrl)。因此,在調用中間件之前,您需要從中剝離/user/assets

順便說一句,你應該爲節點DEBUG環境變量。它允許您查看express創建哪些路由,這在調試404問題時非常方便。例如。你會在Linux上執行$ DEBUG=* node index.js

正如你所看到的,這種方法開始有點不順手,並且在每個請求上創建一個新的中間件並不是非常友好。因此,根據您的用戶目錄包含的內容,使用res.sendFile實際上可能會更好。

一點題外話,我想你已經檢查了req.user實際上包含的東西,如果用戶登錄。

+1

很好,謝謝! res.sendFile正是我所需要的。否則,它確實最終會變得怪異。 – Flaudre