nodejs的更好路由表达

时间:2013-02-24 08:13:08

标签: node.js routing express

我是新来表达的,并且在页面上运行...

/*
 * 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消息。

我真的只想尝试渲染任何地址,然后在没有文件系统读取步骤的情况下捕获错误。

1 个答案:

答案 0 :(得分:1)

您可以安装一个错误处理程序来捕获错误:

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

理想情况下,您应将其放置在尽可能接近app.listen()的位置,以使其成为链中最后的中间件之一。当你这样做时,你的'通用'处理程序可能如下所示:

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

如果在错误处理程序中调用next()(而不是以某种方式生成错误页面),则失败的请求最终将导致404(未找到)错误。根据您的情况,这可能会也可能不会。此外,所有错误都会被捕获,而不仅仅是缺少模板文件。