我知道使用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时。
如果您需要更多信息,请告知我们。
答案 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,并以某种方式为您的特定问题提供解决方案。