如何使用 harp 作为库渲染 404 页面
How to render 404 pages with harp as library
我使用 harp 作为 Express 中间件来呈现我的静态文件,我将其写为 jade/coffee/stylus。一切正常,除非我浏览一个不存在的页面。迎接我的不是通常的 404 页面,而是一个普通的 "Cannot GET /(page name)"。如果我 运行 使用 "harp server" 而不是使用节点的站点,自然可以正常工作。
我认为问题是我必须从服务器内部重定向 404 页面。但是,如果我这样做,Express 将无法识别 jade 格式。然后我必须安装 jade 并将其用作视图引擎。另外,如果我使用手写笔,我也必须添加该渲染。它违背了使用竖琴作为中间件的目的。
任何人都可以建议一个像 harp 的独立版本一样处理自定义 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
看来问题出在这里: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
})
})
})
})
})
}
}
显然,如果没有回调结束响应,竖琴只是恢复原始 url 并调用 next
,因此控制权返回到您的 express 应用程序。
你可以 fork 它并添加一个选项来处理 404,也就是说,让 harp 知道它之后不会有中间件。
这一行看起来很相关:https://github.com/sintaxi/harp/blob/master/lib/middleware.js#L247
我使用 harp 作为 Express 中间件来呈现我的静态文件,我将其写为 jade/coffee/stylus。一切正常,除非我浏览一个不存在的页面。迎接我的不是通常的 404 页面,而是一个普通的 "Cannot GET /(page name)"。如果我 运行 使用 "harp server" 而不是使用节点的站点,自然可以正常工作。
我认为问题是我必须从服务器内部重定向 404 页面。但是,如果我这样做,Express 将无法识别 jade 格式。然后我必须安装 jade 并将其用作视图引擎。另外,如果我使用手写笔,我也必须添加该渲染。它违背了使用竖琴作为中间件的目的。
任何人都可以建议一个像 harp 的独立版本一样处理自定义 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
看来问题出在这里: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
})
})
})
})
})
}
}
显然,如果没有回调结束响应,竖琴只是恢复原始 url 并调用 next
,因此控制权返回到您的 express 应用程序。
你可以 fork 它并添加一个选项来处理 404,也就是说,让 harp 知道它之后不会有中间件。
这一行看起来很相关:https://github.com/sintaxi/harp/blob/master/lib/middleware.js#L247