2017-04-25 51 views
1

使用Hapijs Node框架,我想确保每个请求都存在某个Cookie。如果它不存在,我想创建它。我想这样做,而无需手动将该cookie添加到每个reply。例如,像这样:Hapijs - 为所有请求添加cookie

server.ext('onPreHandler', function (request, reply) { 
    console.log(`state: ${JSON.stringify(request.state)}`) // state == null 
    request.state['my_cookie'] = request.state.my_cookie || 'my data' 
    return reply.continue(); 
}); 


server.route({ 
    method: 'GET', 
    path: '/', 
    handler: function(request, reply) { 
     // includes `my_cookie` 
     reply(`Cookies: ${JSON.stringify(request.state)}`); 
    } 
}) 

// cookie does not exist in the browser 

并称cookie来回复工作,但需要增加整个应用程序的每个答复。

server.route({ 
    method: 'GET', 
    path: '/', 
    handler: function(request, reply) { 
     reply(`Cookies: ${JSON.stringify(request.state)}`).state('my_cookie', 'my_data'); 
    } 
}) 

// cookie now exists in the browser 

如何确保将cookie添加到所有请求中,而无需在每个回复中手动添加cookie?

回答

1

我最终能够做到这一点与server.ext

server.ext('onPreHandler', function (request, reply) { 
    request.state.my_cookie || reply.state('my_cookie', 'my value') 

    reply.continue(); 
}); 
+1

太棒了,你已经找到了解决方案:) –

2

hapi为您提供开箱即用的功能。

首先,你需要准备你的服务器特定的Cookie:

const Hapi = require('hapi') 
// create new server instance 
const server = new Hapi.Server() 

server.state('session', { 
    ttl: 1000 * 60 * 60 * 24, // 1 day lifetime 
    encoding: 'base64json'  // cookie data is JSON-stringified and Base64 encoded 
}) 

之后,您可以使用reply接口设置你的cookies。这可以在路由处理程序或扩展请求生命周期的插件中。

延长请求lifecylce(插件是一个很好的用例为)

以下示例代码延伸HAPI的request lifecycle和与被在每次请求

server.ext('onRequest', function (request, reply) { 
    if (!request.state.cookie_name) { 
    reply.state('session', {your: 'cookie_data'}) 
    } 

    reply.continue() 
}) 

处理路由处理器

server.route({ 
    method: 'GET', 
    path: '/', 
    config: { 
    handler: function (request, reply) { 
     const cookie = { 
     lastVisit: Date.now() 
     } 

     reply('Hello Future Studio').state('session', cookie) 
    } 
    } 
}) 

读取cookie这样的:

const cookie = request.state.session 

你可以阅读更多的cookies and how to keep states across requests, in this guide

希望有帮助!

+0

Thanks @MarcusPoehls。这是一个cookie,必须在每个请求上设置。您的解决方案是针对特定请求的。你知道有什么方法可以处理每一个请求吗? – dyer

+0

我已更新我的问题以澄清我正在尝试解决的问题。如果您有任何进一步的想法,我很乐意听到他们。 – dyer

+0

啊,我明白了。我会做的是向你的hapi服务器注册一个插件,检查你的请求是否有给定的cookie,如果还没有设置,请添加它。我用示例代码更新了我的答案。 –