2

我的目标是创建一个路由,将请求代理到远程 API 的特定路径。我无法使此路由匹配 GET 请求。POST 请求匹配,调用通过。例如,从浏览器到 /api/document 的 POST 请求成功地代理到目标。不过,Hapi 使用 404 响应 GET /api/document。我可以为方法键创建两条具有不同值的相同路由,但这似乎并不干燥。

    server.route({
    path: '/api/{path*}',
    method: '*',
    config: {
        handler: {
            proxy: {
                passThrough: true,
                mapUri: function (request, callback) {
                    var baseUri = 'https://remote/services/v1';
                    var resourceUri = request.path.replace('/api', '');
                    var destinationUri = baseUri + resourceUri;

                    server.log('Proxying to: ' + destinationUri);
                    callback(null, destinationUri);   
                }
            }
        }
    }
});

    server.route({
        method: 'GET',
        path: '/{path*}',
        handler: {
            file: '../build/index.html'
        }
    });
4

1 回答 1

2

根据文档,当您在路由中使用 ' ' 通配符时,它只会在未找到完全匹配的情况下匹配。您的“catchall”路线的方法与路线匹配,并且该方法更具体,因此它似乎正在通过 /{path } 路线。

方法 -(必需)HTTP 方法。通常是“GET”、“POST”、“PUT”、“PATCH”、“DELETE”、“OPTIONS”之一。允许使用任何 HTTP 方法,但“HEAD”除外。使用 '*' 匹配任何 HTTP 方法(仅当未找到完全匹配时,并且与特定方法的任何匹配将被赋予比通配符匹配更高的优先级)。可以分配一组方法,其结果与手动添加具有不同方法的相同路由相同。

您可以通过使用通配符来捕获所有内容或为代理路由传递数组而不是使用通配符来解决此问题。

于 2014-09-17T00:22:05.300 回答