如何使用竖琴作为库渲染404页面

时间:2015-02-04 11:29:33

标签: node.js express coffeescript pug harp

我使用竖琴作为Express中间件来渲染我的静态文件,我将其写为jade / coffee / stylus。一切正常,除非我浏览不存在的页面。而不是通常的404页面,我接受了一个简单的"无法获取/(页面名称)"。如果我使用" harp server"运行该站点而不是使用节点,自然它工作正常。

我认为问题在于我必须从服务器内重定向404页面。但是,如果我这样做,Express不会识别玉格式。然后我必须安装jade并将其用作视图引擎。另外,如果我使用手写笔,我也必须添加该渲染。它违背了使用竖琴作为中间件的目的。

任何人都可以建议一个处理自定义404.jade文件的替代方案,就像竖琴的独立版本一样吗?

我的代码:

express = require "express"
harp = require "harp"
app = express()

app.use express.static __dirname + "/public"
.use harp.mount __dirname + "/public"

#the following does not work

.use (req,res) ->
  res.status(404).render __dirname + "/public/404.jade"

.listen 3000

1 个答案:

答案 0 :(得分:1)

问题似乎在于:https://github.com/sintaxi/harp/blob/master/lib/index.js#L89

exports.mount = function(mountPoint, root){

  if(!root){
    root = mountPoint
    mountPoint = null
  }else{
    var rx = new RegExp("^" + mountPoint)
  }

  var finder = middleware.regProjectFinder(root)

  return function(req, rsp, next){

    if(rx){
      if(!req.url.match(rx)) return next()
      var originalUrl = req.url
      req.url         = req.url.replace(rx, "/")
    }

    finder(req, rsp, function(){
      middleware.setup(req, rsp, function(){
        middleware.static(req, rsp, function(){
          middleware.poly(req, rsp, function(){
            middleware.process(req, rsp, function(){
              if(originalUrl) req.url = originalUrl
              next() // HERE
            })
          })
        })
      })
    })
  }
}

显然,如果没有回调结束响应,竖琴只会恢复原始网址并调用next,因此控件会返回到您的快速应用。

你可以分叉它并添加一个选项来处理404,也就是说让竖琴知道之后就没有中间件了。

此行看似相关:https://github.com/sintaxi/harp/blob/master/lib/middleware.js#L247