0

私は表現するのが初めてで、ページを立ち上げて実行しています...

/*
 * Module dependencies
 */
var express = require('express'),
  stylus = require('stylus'),
  nib = require('nib'),
  app = express(),
  fs = require('fs'),
  path = require('path')

function compile(str, path) {
  return stylus(str).set('filename', path).use(nib())
}

app.set('views', __dirname + '/views')
app.set('view engine', 'jade')
app.use(express.logger('dev'))
app.use(stylus.middleware({
  src: __dirname + '/public',
  compile: compile
}))

app.use(express.static(__dirname + '/public'))

app.get('/', function(req, res) {
  res.render('index', {
    title: 'Home'
  })
})

app.use(function(req, res, next){

  // test if te file exists
  if(typeof fs.existsSync != "undefined"){
    exists = fs.existsSync
  } else {
    exists = path.existsSync
  }

  // if it does, then render it
  if(exists("views"+req.url+".jade")){
    res.render(req.url.replace(/^\//,''), { title: 'Home' })

  // otherwise render the error page
  } else {
    console.log("views"+req.url+".jade")
    res.render('404', { status: 404, url: req.url, title: '404 - what happened..?' });
  }

});

app.listen(3000)

私が抱えている問題は、ページが存在するかどうかを判断するためにファイルシステムの非常に貧弱なチェックを使用したことです。これを処理するためのより良い方法があると思いますが、私のグーグル検索では結果が得られませんでした。

使用しようとするapp.errorと、undefinedメッセージが表示されます。

ファイルシステムの読み取り手順を実行せずに、指定されたアドレスをレンダリングしてエラーをキャッチしたいだけです。

4

1 に答える 1

1

エラーをキャッチするエラーハンドラーをインストールできます。

app.use(function(err, req, res, next) {
  // ... handle error, or not ...
  next(); // see below
});

理想的にapp.listen()は、チェーンの最後のミドルウェアの 1 つにするために、これをできるだけ近くに配置する必要があります。そうすると、「ジェネリック」ハンドラーは次のようになります。

app.use(function(req, res, next) {
  res.render(req.url.replace(/^\//,''), { title: 'Home' });
});

next()エラー ハンドラーを (エラー ページを生成する代わりに)呼び出すと、失敗した要求は最終的に 404 (Not Found) エラーになります。状況によっては、これで問題ない場合もあります。また、テンプレート ファイルの欠落だけでなく、すべてのエラーが検出されます。

于 2013-02-24T08:51:20.530 に答える