hapi.js - 404 路由 VS 静态文件路由
Posted
技术标签:
【中文标题】hapi.js - 404 路由 VS 静态文件路由【英文标题】:hapi.js - 404 route VS static files route 【发布时间】:2015-06-01 00:57:19 【问题描述】:我正在尝试将我的 Express 应用程序迁移到 hapi.js,但我的路线遇到了问题。我只想要 2 GET:我的索引 '/',以及所有不是 '/' 的东西都重定向到 '/'。
使用 Express 我有这个:
// static files
app.use(express.static(__dirname + '/public'));
// index route
app.get('/', function (req, res)
// whatever
// everything that is not /
app.get('*', function(req, res)
res.redirect('/');
);
我在使用 hapi.js 时遇到了问题,无法获得相同的行为。我的“静态道路”是这样的:
server.route(
method: 'GET',
path: '/path*',
handler:
directory:
path: 'public',
listing: false
);
而我的“404 路”将是:
server.route(
method: 'GET',
path: '/path*',
handler: function (request, reply)
reply.redirect('/');
);
我得到这个错误:
Error: New route /path* conflicts with existing /path*
我该如何解决这个问题?
【问题讨论】:
【参考方案1】:您使用相同的方法和路径定义了 2 个路由,就 hapi 的路由器而言,这是一个冲突。这就是您收到错误的原因。
如果directory
处理程序未找到文件,默认情况下会以 404 错误响应。
您可以做的是使用onPreReponse
处理程序拦截它,该处理程序检查响应是否为错误响应(Boom 对象),如果是,则按照您的意愿进行响应。在您的情况下,通过重定向到 /
:
var Hapi = require('hapi');
var server = new Hapi.Server();
server.connection( port: 4000 );
server.route([
method: 'GET',
path: '/',
handler: function (request, reply)
reply('Welcome home!');
,
method: 'GET',
path: '/p*',
handler:
directory:
path: 'public',
listing: false
]);
server.ext('onPreResponse', function (request, reply)
if (request.response.isBoom)
// Inspect the response here, perhaps see if it's a 404?
return reply.redirect('/');
return reply.continue();
);
server.start(function ()
console.log('Started server');
);
推荐阅读:
hapi 的请求生命周期和扩展点:http://hapijs.com/api#request-lifecycle 响应对象:http://hapijs.com/api#response-object【讨论】:
感谢您的回答,我喜欢您处理状态码的方法。但是,为了节省时间,我选择更改静态路径以删除 404 冲突。 @ThibaudTallon,如果您的应用程序允许,我认为这绝对是一个明智的想法。虽然扩展点很强大,但我认为尽量减少它们的使用是个好主意。以上是关于hapi.js - 404 路由 VS 静态文件路由的主要内容,如果未能解决你的问题,请参考以下文章
Next.js:_next/webpack-hmr 请求 404
Next.js:_next / webpack-hmr请求404
Springboot捕获全局异常404-NoHandlerFoundException及Swagger/静态路由处理
WCF HTTP 错误 404.17 - 未找到 请求的内容似乎是脚本,不会由静态文件处理程序提供