2017-04-25 81 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,如果還沒有設置,請添加它。我用示例代碼更新了我的答案。 –

相關問題