2016-01-31 43 views
7

Express'i kullanarak örnek bir web sitesi yapıyorum ve tam olarak anlamadığım bir şeye çarpıyorum.
Doğru bir şekilde anladığımda hata kodu olan ara katman (lar) boru hattındaki son bir tanesi olmalıdır. Örneğin, sadece iyi çalışır:Ara katman yazılımı her zaman hata yapmıyor

var http = require('http'); 
var express = require('express'); 

var app = express(); 
app.set('view engine', 'jade'); 
app.set('views', './views'); 

app.use(express.static('./public')); 
http.createServer(app).listen(portNumber, function() { }); 

app.get('/hello', function(req, res) { 
    res.send('Welcome!'); 
}); 

app.use(function(err, req, res, next) { 
    res.status(500).send('something broke!'); 
}); 

app.get('/error', function(req, res, next) { 
    somethingNonExistent(2016); 
}); 

Ancak, ben http.createServer çağrı önce ortakatmanını kayıt, ancak diğer tüm ara katman tescil edilmesinden sonra, o işe yaramaz eğer - benim kod çağrılmaz:

var http = require('http'); 
var express = require('express'); 

var app = express(); 

app.use(express.static('./public')); 

app.use(function(err, req, res, next) { 
    res.status(500).send('something broke!'); 
}); 

http.createServer(app).listen(portNumber, function() { }); 

app.get('/hello', function(req, res) { 
    res.send('Welcome!'); 
}); 

app.get('/error', function(req, res, next) { 
    somethingNonExistent(2016); 
}); 

burada ne kaçırdım? Tahminim, app.get çağrılarının bazı ara katman yazılımlarını dahili olarak kullanması ve bu durumun berbat olması.
Herhangi bir değişiklik yaparsa, Express 3.2.6 ve Node.js 0.10.29 kullanıyorum

+2

Lütfen aşağıya oy verin lütfen – chester89

+0

Downvotes hakkında emin değilim, ama cevap vermek için ne zaman aramamı engelleyen gereksiz bir kod. Cevap almanın en iyi yolu, tüm uygulamanızı yayınlamadığınız en basit kullanım durumunu yayınlamaktır. Kimse hata ayıklamadan hoşlanmıyor, bir başkasının kodunu ayıklamaya bile gerek yok. Limana giriş yapma, ortam yapılandırmalarını ayarlama, bir günün uzunluğunu hesaplamak için matematik, vs. 'var app = express(); app.use (bir şey); app.get ("/ merhaba", ...);/* hata işleme girişimi */' – cdbajorin

+0

@cdbajorin noktası alındı. – chester89

cevap

3

Rotaları/ara katmanları tanımladığınızda, belirttiğiniz path, gelen isteklerle eşleşip eşleşmediğini görmek için kullanılır. İsteğiniz her zaman ilk eşleşmeye yönlendirilecektir. Bir isteğin birden çok eşleşmesi olabilir, bu nedenle burada sipariş önemlidir. Bir sonraki eşleşen rotaya/ara katmana next() işlevini çağırarak ulaşabilirsiniz. Bir yol belirtmeden app.use kullanarak ortakatmanını monte zaman

her yolu o ortakatmanını vurmak uygundur. Öyleyse, monte ettiğiniz ilk şeyse, her istek bu aracı kullanacaktır. Eğer bir yakalayacağım tüm hata işleyicisi istiyorsanız

, sen de tam tersi isteyeceksiniz - Eğer rota tanımları en sonunda ortakatmanını monte edilmelidir. Aslında bu ara katman ulaşmak için işleyicinizde next işlevi çağırmak gerekir:

app.get('/hello', function(req, res, next) { 
    ... 
    // Let's pretend that there was some error 
    next() 
}); 

// After all of your route definitions... 
app.use(function(req, res) { 
    res.status(500).send('something broke!'); 
}) 

Not hiçbir rota geçerli yolu için varsa, ayrıca bu yakalayacağım tüm ortakatmanını vuracaktır söyledi.

+0

, böyle bir şey bekliyordu. Ayrıca, – chester89

+0

teşekkürler, cevabınızın her iki sürüm 3 ve 4 için de geçerli olduğundan şüpheleniyorum? Sadece meraklı – chester89

+0

Evet, bu sürüm 3 ve 4 için çalışır. – Wex

-1

Dokümanlar

http://expressjs.com/en/guide/error-handling.html

tanımlayabilir hata işleme için diğer app.use sonra geçen ara katman() ve aramaları yolları; örneğin:

var bodyParser = require('body-parser'); 
var methodOverride = require('method-override'); 

app.use(bodyParser()); 
app.use(methodOverride()); 
app.use(function(err, req, res, next) { 
    // logic 
}); 

İç

anlayış kolaylığı için, boru hattını tahmin edebilirsiniz. Denetleyiciniz bir istek aldığında, Express içinde o sonra kod atmak hatası, bu err ile next arayacak Yani bu

try { 
    fn(req, res, next); // your controller 
} catch (err) { 
    next(err); 
} 

benziyor. Temel olarak, next(new Error()) numaralı telefonla aynıdır. Bundan sonra, middleware boru hattında 4 argüman ile bir sonraki ara katman bulmaya çalışın. Durumunuzda, hata işleyiciniz'dan önce 'u gölgeli denetleyiciniz olarak ilan etti, böylece o da dahil değil. Teknik olarak, kontrolör ve orta gelirler arasında hiçbir fark yoktur. İsteğe bağlı olarak denetleyicide next parametresini geçebilir ve daha sonra boru hattından geçmek için bunu çağırabilirsiniz.next() numaralı telefonu aramazsanız, isteğin işlenmesini tamamlarsınız.

+0

İlk snippet nasıl çalıştı, bu durumda? – chester89

+0

, express @ 4 ile çalışmıyor –

İlgili konular