【问题标题】:How to serve user specific static content in Express.js如何在 Express.js 中提供用户特定的静态内容
【发布时间】:2017-04-11 05:19:07
【问题描述】:

我想在 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 包含有效的用户元素。

【问题讨论】:

    标签: node.js security express assets static-content


    【解决方案1】:

    仅仅调用express.static是不够的,你需要用路由器use()它。不幸的是,您不能直接这样做,因为您需要为每个用户设置不同的路线。

    调用express.static 将返回一个中间件函数。您可以直接调用它,即这样的:

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

    但这还不够,因为中间件使用req.url 来构建文件路径。快速路由器调整此属性并删除安装点(请参阅文档中的req.originalUrl)。所以你需要在调用中间件之前去掉/user/assets

    顺便说一下,你应该为node.js设置DEBUG环境变量。它可以让你看到 express 创建了哪些路由,这在调试express.static 404 问题时非常方便。例如。你会在 Linux 上使用$ DEBUG=* node index.js

    正如您所看到的,这种方法开始有点笨拙,并且在每个请求上创建一个新的express.static 中间件也不是非常友好的性能。因此,根据您的用户目录包含的内容,使用 res.sendFile 实际上可能会更好。

    作为旁注,我假设您已经检查了req.user 在用户登录的情况下实际上包含某些内容。

    【讨论】:

    • 太好了,谢谢! res.sendFile 正是我想要的。否则它确实会变得很糟糕。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2018-09-21
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2017-09-23
    相关资源
    最近更新 更多