【问题标题】:How to properly set and test Hapi domain and subdomain?如何正确设置和测试 Hapi 域和子域?
【发布时间】:2015-03-18 15:47:31
【问题描述】:

我目前正在更新一个small library,它用于从请求对象中解析语言环境。它目前可以与 Express 和 Koa 一起使用,但我正在尝试让它与 Hapi 一起使用。

对于测试,我使用 Mocha 和 Hapi 的 inject 方法,如他们的文档中所述。我还查看了他们的文档以设置服务器的properties,但我没有找到设置诸如locahost.en 之类的域甚至诸如en.localhost.com 之类的子域的示例。

目前,我的测试设置如下:

var server = new Hapi.Server();
server.connection({
    //is this correct?
    uri:'localhost.en:3000',
    port: 3000
});

var handler = function(request, reply) {
    //return the parsed locale {String}
    return reply(accept(request, {
           supported: ['en']
    }).getFromDomain());
 };

server.route({
    method: 'GET',
    path: '/',
    handler: handler
});
server.start(function() {});

inject 设置如下:

server.inject({
    method: 'GET',
    url: '/',
    headers: {
        'Accept-Language': 'ja',
        'Set-Cookie': 'mycookie=test'
     }}, function(res) {
        assert.strictEqual(res.result, 'en');
        done();
});

如何在服务器属性中设置域和子域?有没有一个插件可以做到这一点?另外,我如何从request 获取/解析域和子域?我假设我可以从hostname 获取域,但是子域呢?

【问题讨论】:

    标签: node.js hapijs


    【解决方案1】:

    默认情况下,Hapi 将在网络接口上的端口上侦听所有请求,而不管域如何(由 host 标头的值指示)。如果要获取请求的主机头的值,只需检查request.headers.host即可。

    如果只想查看解析后的主机名(域名),可以查看request.info.hostname

    server.route({
        method: 'GET',
        path: '/',
        handler: function(request, reply) {
    
            var hostname = request.info.hostname;    
    
            reply('Ok');
         }
    });
    

    如果要限制路由(或插件)允许的主机名,可以设置 vhost 选项。

    server.route({
        method: 'GET',
        path: '/',
        vhost: ['en.example.com'],
        handler: function(request, reply) {
    
            reply('Ok');
         }
    });
    

    要使用server.inject 测试不同的虚拟主机,您只需包含显式主机标头

    server.inject({
        method: 'GET',
        url: '/',
        headers: {
            'Set-Cookie': 'mycookie=test',
         }}, function(res) {
    
            Assert(res.statusCode === 404);    // 404 because not en.example.com
    });
    
    server.inject({
        method: 'GET',
        url: '/',
        headers: {
            'Set-Cookie': 'mycookie=test',
            'Host': 'en.example.com'
         }}, function(res) {
    
            Assert(res.statusCode === 200);    // 200 because en.example.com
    });
    

    【讨论】:

    • 太棒了,而且我从没想过我会收到写great blogs的人的回复!谢谢!
    • @iwatakeshi 谢谢 :)
    猜你喜欢
    • 2012-01-12
    • 2015-07-24
    • 2015-09-18
    • 2013-07-22
    • 1970-01-01
    • 2023-01-28
    • 2011-03-08
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多