簡體   English   中英

如何在Express.js中提供用戶特定的靜態內容

[英]How to serve user specific static content in Express.js

我想在Express中提供用戶特定的靜態內容 這意味着,如果用戶登錄,則Express將為其私人靜態文件夾提供服務。 其他用戶無權訪問。

我嘗試了以下操作(請參見下文),但未提供靜態內容。 實際上,該路線似乎被完全忽略了,我得到了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只是一種在用戶ID(字符串)中轉義怪異字符的方法。 我知道可能會出現不匹配的情況,這種情況很小,而且我現在不想在乎。 對於解決嘗試的方式的總體安全性的擔憂,是可以理解的。 該代碼用CoffeeScript編寫。

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

僅調用express.static是不夠的,您需要在路由器上use()它。 不幸的是,您不能直接這樣做,因為您需要為每個用戶設置不同的路由集。

調用express.static將返回中間件函數。 您可以直接調用它,例如:

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

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

順便說一句,您應該為節點設置DEBUG環境變量。 它使您可以查看express創建的路由,這在調試express.static 404問題時非常方便。 例如,您將在Linux上執行$ DEBUG=* node index.js

如您所見,該方法開始有點笨拙,並且在每個請求上創建一個新的express.static中間件也不是很友好的性能。 因此,根據您的用戶目錄包含的內容,使用res.sendFile實際上可能更好。

req.user一下,假設您已檢查req.user實際上是否包含用戶登錄的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM