Использование промежуточного программного обеспечения express.static на авторизованном маршруте

Я использую node с 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 статические ресурсы, специфичные для модуля

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

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

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

Ответ 1

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

Итак, после того, как кто-то отправил на вопрос, я вернулся к этому ответу, чтобы найти, что, хотя я упоминаю паспортные данные, я никогда не показывал, как я закончил использовать эту функцию.

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

Ответ 2

Вы также можете добавить 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.