在服务器渲染hapi时如何请求cookie?

时间:2015-12-12 20:45:34

标签: cookies fetch server-side hapijs

我知道使用express时,可以使用以下代码请求cookie:

req.get('cookie')

但是,在使用hapi服务器请求cookie时,我现在面临一个问题。

请求cookie的代码应如下:

request.state['COOKIE_NAME']

然而,当服务器呈现我的页面时,我的request.state始终是emtpy。当cookie在客户端上发出请求时,没有问题,request.state会填充cookie。

在我的服务器文件中,我使用onPreResponse挂钩,如下所示:

server.ext( 'onPreResponse', ( request, reply ) => {
...
  fetch('http://localhost:3000/api/getcookie', {
    credentials: 'same-origin',
    headers: {'Cookie': request.state['COOKIE_NAME']} // Still empty
  })
...
});

hapi路线是:

{
  method: 'GET',
  path: '/getcookie',
  config: {
    auth: false
},
  handler: ( request, reply ) => {
    console.log('GET COOKIE ROUTE: ', request.state); // <-- this is empty when server rendering

    reply({
      statusCode: 200,
      message: 'get cookie',
      data: {
        text: request.state
      }
    })
    .code(200);
}

正在设置cookie没有问题,我也可以在客户端上检索它们。问题是当我尝试在服务器上获取cookie时。

如果您需要更多信息,请告知我们。

1 个答案:

答案 0 :(得分:1)

你的问题对我来说有点难以理解。你写...

  

正在设置cookie没有问题,我也可以在客户端上检索它们。问题是当我尝试在服务器上获取cookie时。

...但我没有看到任何实际设置cookie值的代码。所以我无法理解你如何成功进入客户端。要使用某种onPreResponse方法在服务器fetch扩展点中请求相同的路由,我也不清楚。

我写了一个小而完整的示例,它实际上设置了一个cookie,并且还使用了onPreResponse扩展点。

'use strict';

const Hapi = require('hapi');
const Path = require('path');

// Create a server with a host and port
const server = new Hapi.Server();
server.connection({
  port: 3000
});

//Define the cookie
server.state('data', {
    encoding: 'base64json'
});

// Add the route
server.route({
  method: 'GET',
  path: '/getcookie',
  handler: function(request, reply) {

    const counterState = request.state.data.counter;
    const counter = counterState ? counterState + 1 : 1;

    return reply({
      statusCode: 200,
      message: 'get cookie',
      currentState: request.state
    })
    .state('data', {counter: counter}); //<-- You missed to actually SET your cookie!
  }
});

server.ext( 'onPreResponse', ( request, reply ) => {

  //Here you have full access to the original request
  console.log("PreResponse counter value: " + request.state.data.counter);

  return reply.continue();

});

// Start the server
server.start((err) => {

  if (err) {
    throw err;
  }

  console.log('Server running at:', server.info.uri);
});

我希望这有助于您了解如何在hapi中使用Cookie,并以某种方式为您的特定问题提供解决方案。