2011-10-03 16 views
23

Node.jsに以下のコントローラ/ルート定義があります(ExpressとMongooseを使用)。ユーザーが存在しないページをリクエストしたときにエラーを処理する最も適切な方法は何でしょうか?Node.js/Express - ページが見つからないときのレンダリングエラー

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 
      } 
      }); 
     }); 
    }); 

現在、私のアプリが壊れています。私はエラーと何もしていないので、私は信じている私は成功のようにビューに渡しているだけです?

TypeError: Cannot read property 'title' of null 

ありがとうございました。

答えて

46

エクスプレスerror-pagesの例を参照してください。原則として、まずアプリケーションルートを登録してから、ルートにマップされていない他のすべてのリクエストに対してcatch all 404ハンドラを登録します。最後に、500ハンドラが次のように登録されています。

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

ええ、私はExpressの例を見てきたようです。しかし、これはとにかくとても役に立ちました。私は独自の500.ejsなどを作成しましたが、必要に応じてレンダリングしましたが、指定したときに私自身のエラーメッセージも追加できます。ありがとう。 – tuddy

+1

404の処理でapp.use()を追加すると、何らかの理由でパブリックフォルダ内のすべてのルートが壊れてしまいます。 /stylesheets/style.cssのように、通常は私のejsテンプレートからアクセスされるので、突然失われてしまいます。これに対する提案はありますか? – netpoetica

+0

ここに示した例の前にapp.use(static ....)を動かすだけで静的パスを壊すexpress app.use()ミドルウェアの問題を修正できました – netpoetica

3

Node.JSの主な問題の1つは、クリーンエラーをキャッチすることがないことです。従来の方法では通常、すべてのコールバック関数のあるエラーがある場合は、最初の引数は、nullではないので、例えば:

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

あまりにも多くのコールバックと、しばらくして醜い得ることができます物事、そして私が使用することをお勧めしますasyncのように、1つのエラーがある場合はエラーコールバックに直接進みます。

編集:express error handlingも使用できます。

+0

+1は役に立ちました。 'null'ではなく' undefined'があるべきではありません。 –

+0

@SushantGupta no、** Nican **は正しいです。これはヌルかエラーオブジェクトです。 –