问题 在授权路由中使用express.static中间件


我正在使用带有express和passportjs的节点来限制对位于私人文件夹中的文件的访问。我已将代码缩减为以下内容。 公共静态文件夹中的所有内容都运行良好,但通过使用staticMiddleware路由目标私有文件夹会返回404错误。

var express = require('express')
,   util = require('util');

var app = express.createServer();
var staticMiddleware = express.static(__dirname + '/private');

app.configure(function() {
  app.use(app.router);
  app.use(express.logger('dev')); 
  app.use('/public',express.static(__dirname + '/public'));
});

app.get('/private/:file', function(req, res, next){
    console.log('about to send restricted file '+ req.params.file);
    staticMiddleware(req, res, next);
});
app.listen(16000);

我正在使用以下似乎适用于其他人的参考文献,所以我必须遗漏一些东西。 对于我来说,仅对私人区域内容的404响应显示不起作用。

Node.js特定于模块的静态资源

即使使用express.static,NodeJS也不会提供静态文件

重定向到express.js中的静态文件

我可以发誓我之前有过这个工作,也许它在一个新版本的东西中被打破了。

  • 节点v0.8.1
  • npm 1.1.12
  • express@2.5.11
  • connect@1.9.2

5665
2017-07-13 15:19


起源

我正在寻找完全相同的东西。有一些关于如何做的想法,但感谢您自己回答。这是一个非常好的解决方案。 - Mathias


答案:


sheesh一直盯着我看

app.get('/private/:file', function(req, res, next){
    console.log('about to send restricted file '+ req.params.file);
    req.url = req.url.replace(/^\/private/, '')
    staticMiddleware(req, res, next);
});

编辑11-29-2014

所以在有人发布问题之后,我回到这个答案,发现尽管我提到了passportjs,但我从未表明我最终是如何使用这个功能的。

var staticMiddlewarePrivate = express['static'](__dirname + '/private');

app.get('/private/*/:file', auth.ensureAuthenticated, function(req, res, next){
    console.log('**** Private ****');
    req.url = req.url.replace(/^\/private/, '');
    staticMiddlewarePrivate(req, res, next);
});

15
2017-07-13 15:28





你也可以添加 express.static(__dirname + '/private'); 到您的app.config。

app.configure(function() {
  app.use(app.router);
  app.use(express.logger('dev')); 
  app.use('/public',express.static(__dirname + '/public'));
  app.use('/private',express.static(__dirname + '/private'));
});

private 路径中间件将在路径开始时随时执行 private


0
2017-11-07 19:47



这将正确暴露静态文件,但不会保护密码。我的理解是@eephillip希望通过passwordJS提供服务,但也需要密码保护。 - Mathias