2017-04-25 2 views
1

Mit dem Hapijs Node Framework möchte ich sicherstellen, dass ein bestimmter Cookie für jede Anfrage existiert. Wenn es nicht existiert, möchte ich es erstellen. Ich möchte dies tun, ohne diesen Cookie manuell zu jedem reply hinzuzufügen. Zum Beispiel so etwas wie diese:Hapijs - Cookie zu allen Anfragen hinzufügen

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 

Hinzufügen dieses Cookie auf die Antwort funktioniert, wird aber zu jeder Antwort über die App des Hinzufügen erfordern.

Wie kann ich sicherstellen, dass ein Cookie zu allen Anfragen hinzugefügt wird, ohne manuell ein Cookie zu jeder Antwort hinzuzufügen?

Antwort

1

Ich konnte dies schließlich mit server.ext tun.

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

    reply.continue(); 
}); 
+1

Großartig Sie haben bereits eine Lösung gefunden :) –

2

hapi bietet Ihnen die Möglichkeit, Cookies sofort zu verwenden.

Zuerst müssen Sie Ihren Server für ein bestimmtes Cookie vorzubereiten:

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 
}) 

Danach Sie Ihre Cookies mit der reply Schnittstelle einstellen. Dies kann in einem Routen-Handler oder einem Plug-in sein, das den Anforderungslebenszyklus verlängert.

Erweiterte Anfrage Lifecylce (Plugins, um einen guter Anwendungsfall dafür ist)

Der Beispielcode unten hapi der erstreckt request lifecycle und damit wird bei jeder Anfrage

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

    reply.continue() 
}) 

verarbeitet

Route handler

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

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

Lesen Sie das Cookie wie folgt aus:

const cookie = request.state.session 

Sie können mehr über cookies and how to keep states across requests, in this guide lesen.

Hoffe, dass hilft!

+0

Danke @MarcusPöhls. Dies ist ein Cookie, der _must_ bei jeder Anfrage gesetzt werden muss. Ihre Lösung ist für eine bestimmte Anfrage. Weißt du, wie es bei jeder Anfrage geht? – dyer

+0

Ich habe meine Frage aktualisiert, um das Problem zu klären, das ich lösen möchte. Wenn Sie weitere Gedanken haben, würde ich sie gerne hören. – dyer

+0

Ah, ich verstehe. Ich würde ein Plugin auf Ihrem Hapi-Server registrieren, das Ihre Anfrage nach einem bestimmten Cookie prüft und wenn es noch nicht gesetzt ist, fügen Sie es hinzu. Ich habe meine Antwort mit Beispielcode aktualisiert. –

Verwandte Themen