2012-10-16 27 views
38

Tôi đang sử dụng khuôn khổ Express trong Node.js với một số chức năng trung gian:Sử dụng middleware cụ thể trong Express cho tất cả các con đường ngoại trừ một cụ thể một

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

Tôi có thể sử dụng chức năng .use với một tham số bổ sung để sử dụng này middleware chỉ trên các đường dẫn cụ thể:

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

Có thể sử dụng biến đường dẫn để phần mềm trung gian được sử dụng cho tất cả các đường dẫn ngoại trừ một đường dẫn cụ thể, tức là đường dẫn gốc không?

Tôi đang nghĩ về một cái gì đó như thế này:

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

Vì vậy User.checkUser luôn gọi trừ các đường dẫn gốc.

Trả lời

57

Tôi sẽ thêm phần mềm trung gian của CheckUser vào tất cả các đường dẫn của tôi, ngoại trừ trang chủ.

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

hoặc

app.all('*', checkUser); 

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

    //authenticate user 
    next(); 
} 

Bạn có thể mở rộng này với dấu gạch dưới để tìm kiếm các req.path trong một mảng các đường dẫn không chứng thực:

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

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

    //authenticate user 
    next(); 
} 
+1

Cảm ơn bạn, tôi đã triển khai giải pháp gạch dưới. – Thomas

+0

Có thể cho phép tất cả yêu cầu đến một đường dẫn cụ thể, nhưng không cho phép các đường dẫn phụ? (ví dụ: '/', '/style.css', '/background.jpg', nhưng không phải '/ lists /' hoặc '/ titles') – Thomas

+0

tài sản tĩnh của bạn sẽ được phân phát ra khỏi một thư mục tĩnh. – chovy

7

Thay vì đăng ký trực tiếp User.checkUser làm phần mềm trung gian, hãy đăng ký một hàm trợ giúp mới, nói checkUserFilter, được gọi trên mọi URL, nhưng chỉ thực thi cho userFiled` trên các URL đã cho. Ví dụ:

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

app.use(checkUserFilter); 

Về lý thuyết, bạn có thể cung cấp đường dẫn regexp đến app.use. Ví dụ:

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

Đã thử trên tốc độ 3.0.0rc5, nhưng không hoạt động.

Có thể chúng tôi có thể open a new ticket và đề xuất tính năng này làm tính năng?

1

Sử dụng

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

Vượt qua bất kỳ url nào ngoài f rom /. Trừ khi, nó làm việc cho tôi.

Nói chung

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

(thấy How to negate specific word in regex?)

Hope this helps

4

Bạn có thể thiết lập các middleware một mỗi tuyến đường cũng có.

// 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

Đây là những gì tôi đang tìm kiếm !! – Lancelot

Các vấn đề liên quan