修改对hapi服务器发出的所有请求

时间:2017-10-23 14:36:17

标签: javascript angularjs node.js hapijs

我刚刚开始探索Hapi服务器。我想在将其保存到后端之前修改对Hapi服务器发出的所有请求。我遇到了“server.ext'并尝试编写以下代码:

server.ext('onRequest', function (request, reply) {
    var path = request.path;
    path = path.replace(/\str1/g, 'str2')
    request.path = path;
    return reply.continue();
});

我想更新request.path,但这行代码失败了:

request.path = path;

这样做的正确方法是什么?有没有更好的方法来修改对Hapi服务器的所有请求?

2 个答案:

答案 0 :(得分:0)

我已经运行了一些测试,我无法在“onRequest”事件中更改request.path属性,但设法在“onPreHandler”中进行了更改。

“onRequest”总是触发超时错误,意味着当您尝试在“onRequest”事件中改变request.path时,我猜你在内部打破了一些东西。

此处为测试代码示例。

const Hapi = require('hapi');
const Lab = require('lab');
const lab = exports.lab = Lab.script();
const describe = lab.describe;
const it = lab.it;
const beforeEach = lab.beforeEach;
const expect = require('code').expect;

const plugin = (server, options, next) => {
    server.ext('onPreHandler', function (request, reply) {
        // let path = request.path;
        // // path = path.replace(/\str1/g, 'str2');
        request.path = 'xox';
        return reply.continue();
    });

    next();
};

plugin.attributes = {
    name: 'onRequest_test'
};

describe('Hapi server', () => {
    let server;
    beforeEach((done) => {
        server = new Hapi.Server();
        done();
    });


    it('should modify the path attribute', (done) => {
        server.connection();
        server.register({
            register: plugin
        }, (err) => {

            expect(err).to.not.exist();
            server.route({
                method: 'GET',
                path: '/',
                handler: (request, reply) => {
                    expect(request.path).to.equal('xox');

                    done();
                }
            });

            // call main route
            server.inject({
                method: 'GET',
                url: '/'
            }, () => {
                //
            });
        });
    });
});

答案 1 :(得分:0)

您可以使用onRequest事件,请求对象有一个方法来更新名为setUrl的路径。您应该使用它,而不是直接改变路径

server.ext({
  type: 'onRequest',
  method: function (request, reply) {

    // Change all requests to '/test'
    request.setUrl('/test');
    return reply.continue();
  }
});