Как обслуживать страницу React с сервера Hapijs независимо от маршрута - PullRequest
0 голосов
/ 18 марта 2019

У меня есть сервер hapijs, обслуживающий маршруты API и приложение React. Я обслуживаю реагирующее приложение, используя инертный и обработчик с параметрами каталога. Однако, поскольку параметры, которые я использую в пути {param *}, будут автоматически обслуживать index.html, hapijs будет обслуживать страницу реакции только при отсутствии параметров. Это имеет смысл, поскольку хапи будет искать параметр в каталоге и ответит с ошибкой 404.

Теперь я хочу, чтобы хапи обслуживал страницу реакции независимо от параметра (или даже маршрута) и позволял реагировать на ошибку 404. Я не могу найти законное решение. Использование обработчика каталога не позволит использовать 404, а использование обработчика функции для обслуживания страницы будет обслуживать страницу без сценариев css или js.

Я использовал следующий учебник и читал другие, но безрезультатно. https://medium.com/@notrab/using-create-react-app-with-hapi-js-8f4ef3dcd311

//manifest.js
module.exports = {
    server: {
        port: process.env.PORT,
        router: { stripTrailingSlash: true },
        routes: {
            files: {relativeTo: path.join(__dirname, '../client/build')},
            cors: {origin: ["*"],}
        }
    },
    register: {
        plugins: [
            { plugin: require('inert') },
            {
                plugin: 'vision',
                options: {
                    engines: { html: require('handlebars') },
                    path: path.join(__dirname, '../client/build')
                }
            },
            {
                plugin: require('./controllers/home'),
            },
        ],
    }
// controller/home
module.exports.register = function(server, options, next) {
server.route({
    method: 'GET',
    path: '/{param*}',
    handler: {
    directory: {
    path: path.join(__dirname, "../../../client/build/"),
    listing: false,
    index: ['index.html']
}

// the following handler serves the page but not the css or js
    //handler: (request, h) => {
    //    return h.file("index.html", {confine: false});
    //}

1 Ответ

0 голосов
/ 27 марта 2019

При использовании Inert , поскольку у вас есть relativeTo, установленный для разрешения каталога client/build, вам не нужно вводить полный путь снова.

Вы также можете полностью удалить index: ['index.html'], поскольку он по умолчанию будет искать индексный файл

module.exports.register = function(server, options, next) {
server.route({
    method: 'GET',
    path: '/{param*}',
    handler: {
        directory: { path: '.' }
    }
})
...