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 - 未找到 请求的内容似乎是脚本,不会由静态文件处理程序提供

如何使用 dropzone.js 和 hapi.js 上传图片

nginx 404日志格式https配置