Использование express.статическое промежуточное ПО в авторизованном маршруте

Я использую узел с 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 ответа на контент расположен в частной зоне.

узел.JS модуль-специфические статические ресурсы

NodeJS не будет обслуживать статические файлы, даже при использовании express.static

перенаправление в статический файл в express.js

Я мог бы поклясться, что у меня это работало раньше, возможно, это было сломано в новой версии чего-то.

  • узел версии v0.8.1
  • НПМ 1.1.12
  • express@2.5.11
  • connect@1.9.2

2 ответов


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);
});

вы также можете добавить express.static(__dirname + '/private'); в ваше приложение.конфиг.

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.