繁体   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