Использование промежуточного программного обеспечения 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
.