1

私は jade/coffee/stylus として記述した静的ファイルをレンダリングする Express ミドルウェアとして harp を使用しています。存在しないページを閲覧する場合を除いて、すべて正常に動作します。通常の 404 ページの代わりに、プレーンな「/(ページ名) を取得できません」というメッセージが表示されます。ノードを使用する代わりに「harpサーバー」でサイトを実行すると、当然正常に動作します。

問題は、サーバー内から 404 ページをリダイレクトする必要があることだと考えました。ただし、そうすると、Express は jade 形式を認識しません。次に、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
4

1 に答える 1

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

どうやら、コールバックが応答を終了しない場合、harp は単に元の URL を復元して を呼び出すnextため、コントロールは高速アプリに戻ります。

それを fork して、404 を処理するオプションを追加できます。つまり、その後にミドルウェアがないことを harp に知らせます。

この行は関連しているようです: https://github.com/sintaxi/harp/blob/master/lib/middleware.js#L247

于 2015-02-16T12:57:14.537 に答える