如何在 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 只是一种转义用户标识中奇怪字符的方法,它是一个字符串。我知道存在不匹配的可能性,这是很小的,我现在不想关心。对解决尝试方式的一般安全性的担忧表示赞赏。
代码是用 CoffeeScript 编写的。
req.user
包含有效的用户元素。
仅仅调用express.static
是不够的,你需要use()
它与路由器。不幸的是,您不能直接这样做,因为您需要为每个用户设置一组不同的路由。
调用express.static
将return一个中间件函数。你可以直接调用它,也就是像这样:
var files = express.static(userpath);
return files(req, res, next);
然而这还不够,因为中间件使用 req.url
来构建文件路径。 Express 路由器调整此 属性 并删除挂载点(请参阅文档中的 req.originalUrl
)。因此,在调用中间件之前,您需要从中删除 /user/assets
。
顺便说一句,你应该为节点设置DEBUG
环境变量。它可以让你看到 express 创建了哪些路由,这在调试 express.static
404 问题时非常方便。例如。你会在 Linux 上做 $ DEBUG=* node index.js
。
如您所见,该方法开始有点老套,并且在每个请求上创建一个新的 express.static
中间件也不是很友好。因此,根据您的用户目录包含的内容,使用 res.sendFile
实际上可能更好。
作为旁注,我假设您已经检查过 req.user
在用户登录后确实包含某些内容。
我想在 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 只是一种转义用户标识中奇怪字符的方法,它是一个字符串。我知道存在不匹配的可能性,这是很小的,我现在不想关心。对解决尝试方式的一般安全性的担忧表示赞赏。 代码是用 CoffeeScript 编写的。
req.user
包含有效的用户元素。
仅仅调用express.static
是不够的,你需要use()
它与路由器。不幸的是,您不能直接这样做,因为您需要为每个用户设置一组不同的路由。
调用express.static
将return一个中间件函数。你可以直接调用它,也就是像这样:
var files = express.static(userpath);
return files(req, res, next);
然而这还不够,因为中间件使用 req.url
来构建文件路径。 Express 路由器调整此 属性 并删除挂载点(请参阅文档中的 req.originalUrl
)。因此,在调用中间件之前,您需要从中删除 /user/assets
。
顺便说一句,你应该为节点设置DEBUG
环境变量。它可以让你看到 express 创建了哪些路由,这在调试 express.static
404 问题时非常方便。例如。你会在 Linux 上做 $ DEBUG=* node index.js
。
如您所见,该方法开始有点老套,并且在每个请求上创建一个新的 express.static
中间件也不是很友好。因此,根据您的用户目录包含的内容,使用 res.sendFile
实际上可能更好。
作为旁注,我假设您已经检查过 req.user
在用户登录后确实包含某些内容。