我刚刚开始探索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服务器的所有请求?
答案 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();
}
});