2011-10-03 28 views
23

Node.js'de (Express ve Mongoose kullanarak) aşağıdaki denetleyici/yol tanımına sahibim. Kullanıcı, varolmayan bir sayfa istediğinde, en uygun ve en uygun yol hangisi olur?Node.js/Express - Sayfa bulunamadığı zaman hata oluşuyor

app.get('/page/:pagetitle', function(req, res) { 
     Page.findOne({ title: req.params.pagetitle}, function(error, page) { 
      res.render('pages/page_show.ejs', 
      { locals: { 
       title: 'ClrTouch | ' + page.title, 
       page:page 
      } 
      }); 
     }); 
    }); 

Şu anda uygulamanızı kırıyor. İnanıyorum ki hata ile hiçbir şey yapmıyorum çünkü bunu bir başarı gibi görüyorum.

TypeError: Cannot read property 'title' of null 

Çok teşekkürler.

cevap

46

error-pages örneğini inceleyin. İlk önce, uygulama rotalarınızı kaydettirin, daha sonra bir rotayı haritalamayan diğer tüm istekleriniz için tüm 404 işleyiciyi yakalayın. Son olarak, yardımcı olarak, aşağıdaki gibi bir 500 işleyici, yanıtınız için

// "app.router" positions our routes 
// specifically above the middleware 
// assigned below 

app.use(app.router); 

// Since this is the last non-error-handling 
// middleware use()d, we assume 404, as nothing else 
// responded. 

app.use(function(req, res, next){ 
    // the status option, or res.statusCode = 404 
    // are equivalent, however with the option we 
    // get the "status" local available as well 
    res.render('404', { status: 404, url: req.url }); 
}); 

// error-handling middleware, take the same form 
// as regular middleware, however they require an 
// arity of 4, aka the signature (err, req, res, next). 
// when connect has an error, it will invoke ONLY error-handling 
// middleware. 

// If we were to next() here any remaining non-error-handling 
// middleware would then be executed, or if we next(err) to 
// continue passing the error, only error-handling middleware 
// would remain being executed, however here 
// we simply respond with an error page. 


app.use(function(err, req, res, next){ 
    // we may use properties of the error object 
    // here and next(err) appropriately, or if 
    // we possibly recovered from the error, simply next(). 
    res.render('500', { 
     status: err.status || 500 
    , error: err 
    }); 
}); 
+0

Evet, Express örneklerinden geçtiğimi hissediyorum. Ama bu zaten oldukça yardımcı oldu. Kendi 500.ejs'leri kendi oluşturmuştum ... ve şimdi gerekli olanları oluşturdum ama kendi hata mesajlarını da belirtildiği gibi ekleyebilirim. Teşekkürler. – tuddy

+1

404 kullanımıyla app.use() öğesini eklediğimde, tüm yollarımın nedenini herhangi bir nedenle ortak klasörde dağıtır. /stylesheets/style.css, ejs şablonundan normal olarak erişildiği gibi aniden kaybolur. Bunun için herhangi bir öneri? – netpoetica

+0

Sadece app.use (statik ....) sadece burada verilen örneğe göre hareket ederek statik yolumu kırarak ekspres app.use() middleware ile sorunu çözebildim – netpoetica

3

Node.JS ile ilgili önemli sorunlardan biri, temiz bir hata yakalama olmamasıdır. Geleneksel yöntem genellikle her geri arama işlevi için bir hata varsa, ilk bağımsız değişken boş değil, dolayısıyla örneğin:

function(error, page){ 
    if(error != null){ 
     showErrorPage(error, req, res); 
     return; 
    } 
    ...Page exists... 
} 

çok fazla geri aramaları ile bir süre sonra çirkin olabiliyor şeyler, ben kullanılmasını öneriyoruz async gibi bir şey, böylece bir hata varsa, doğrudan bir hata geri arama gider.

DÜZENLEME: Ayrıca express error handling'u da kullanabilirsiniz.

+0

+1 kayıtlıdır. "Null" yerine "undefined" olmamalıdır. –

+0

@SushantGupta no, ** Nican ** doğrudur. Ya null ya da hata nesnesi var. –

İlgili konular