2012-10-16 5 views
38

używam ramy wyrazić node.js z niektórych funkcji middleware:korzystanie z wybranych middleware Ekspresowe dla wszystkich ścieżek z wyjątkiem określonym jednym

var app = express.createServer(options); 
app.use(User.checkUser); 

mogę użyć funkcji .use z dodatkowym parametrem aby skorzystać z tej middleware tylko na konkretnych ścieżek:

app.use('/userdata', User.checkUser); 

Czy jest możliwe aby użyć zmiennej pATH tak, że middleware jest używany dla wszystkich ścieżek z wyjątkiem jednego konkretnego, czyli ścieżki korzeni?

myślę o czymś tak:

app.use('!/', User.checkUser); 

Więc User.checkUser jest zawsze nazywany wyjątkiem toru głównego.

Odpowiedz

57

Dodałbym oprogramowanie pośrednie checkUser do wszystkich moich ścieżek, z wyjątkiem strony głównej.

app.get('/', routes.index); 
app.get('/account', checkUser, routes.account); 

lub

app.all('*', checkUser); 

function checkUser(req, res, next) { 
    if (req.path == '/') return next(); 

    //authenticate user 
    next(); 
} 

Można rozszerzyć ten z podkreśleniem, aby wyszukać req.path w tablicy ścieżek niewyspecjalizowanych uwierzytelnione:

function checkUser(req, res, next) { 
    var _ = require('underscore') 
     , nonSecurePaths = ['/', '/about', '/contact']; 

    if (_.contains(nonSecurePaths, req.path)) return next(); 

    //authenticate user 
    next(); 
} 
+1

Dziękuję, zaimplementowałem rozwiązanie podkreślenia. – Thomas

+0

Czy można zezwolić na wszystkie żądania na określoną ścieżkę, ale nie na ścieżki podrzędne? (tzn. "/", "/style.css", "/background.jpg", ale nie "/ list /" lub "/ tytuły") – Thomas

+0

twoje zasoby statyczne powinny być wyświetlane poza statycznym katalogiem. – chovy

7

Zamiast bezpośrednio rejestracji User.checkUser jako middleware, zarejestrować nową funkcję pomocnika, powiedzmy checkUserFilter, że jest wywoływana na każdym adresie URL, ale przeszedł do userFiled` wykonanie tylko na podanych adresów URL. Przykład:

var checkUserFilter = function(req, res, next) { 
    if(req._parsedUrl.pathname === '/') { 
     next(); 
    } else { 
     User.checkUser(req, res, next); 
    } 
} 

app.use(checkUserFilter); 

Teoretycznie można zapewnić regexp ścieżki do app.use. Na przykład coś takiego:

app.use(/^\/.+$/, checkUser); 

Próbowaliśmy go na wyraźnej 3.0.0rc5, ale to nie działa.

Może moglibyśmy open a new ticket zaproponować to jako funkcję?

1

użytkowania

app.use(/^(\/.+|(?!\/).*)$/, function(req, resp, next){... 

To zdanie niezależnie od adresu URL rom /. Chyba że działa dla mnie.

W ogólnym

/^(\/path.+|(?!\/path).*)$/ 

(patrz How to negate specific word in regex?)

Nadzieja to pomaga

4

Można ustawić middleware po jednej trasy również.

// create application/x-www-form-urlencoded parser 
var urlencodedParser = bodyParser.urlencoded({ extended: false }) 

// POST /login gets urlencoded bodies 
app.post('/login', urlencodedParser, function (req, res) { 
    if (!req.body) return res.sendStatus(400) 
    res.send('welcome, ' + req.body.username) 
}) 
+1

Tego właśnie szukam !! – Lancelot

Powiązane problemy