hapi.js - 404路由与静态文件路由的区别

11

我希望将我的Express应用程序迁移到hapi.js,但是我在处理路由方面遇到了麻烦。我只想有两个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个回答

14

你正在使用相同的方法和路径定义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');
});

推荐阅读:


谢谢你的回答,我喜欢你处理状态码的方法。然而,为了节省时间,我选择更改我的静态路径以避免与404冲突。 - Thibaud Tallon
@ThibaudTallon,我认为这绝对是一个明智的想法,如果你的应用程序允许的话。虽然扩展点很强大,但我认为最好尽量减少它们的使用。 - Matt Harrison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接