如何使用Hapi设置Cookie?代码匹配官方文档却无法设置的问题咨询
嘿,看你这段代码,我一眼就瞅到大概率是isSecure: true在搞鬼!
你现在是在本地用localhost的HTTP服务开发对吧?isSecure这个属性的作用是让Cookie只在HTTPS连接下才会被浏览器存储,而本地开发的HTTP环境完全不满足这个条件,浏览器直接就把这个Cookie给忽略了,自然就设置不成功。
给你几个可行的解决办法:
1. 本地开发临时关闭isSecure
直接把isSecure改成false,这样本地HTTP环境下浏览器就能正常保存Cookie了:
const Hapi=require('hapi'); const server = Hapi.server({ host:'localhost', port:3333 }); server.state('user', { ttl: 24 * 60 * 60 * 1000, // One day isSecure: false, // 本地开发改成false isHttpOnly: true, encoding: 'base64json', clearInvalid: false, strictHeader: true }); server.route({ method:'POST', path:'/login', handler:function(request,h) { var data = request.payload; if(data.account === "你的验证条件") { // 一定要调用state方法来设置Cookie return h.response('登录成功').state('user', { id: 1, name: 'test' }); } return h.response('登录失败').code(401); } }); // 别忘了启动服务器 async function start() { try { await server.start(); console.log('Server running on %s', server.info.uri); } catch (err) { console.log(err); process.exit(1); } } start();
2. 根据环境动态配置(更推荐)
为了避免上线时忘记改回isSecure: true,可以根据环境变量来自动切换:
const isProduction = process.env.NODE_ENV === 'production'; server.state('user', { ttl: 24 * 60 * 60 * 1000, isSecure: isProduction, // 生产环境用true,开发环境自动用false isHttpOnly: true, encoding: 'base64json', clearInvalid: false, strictHeader: true });
额外检查点
- 确认你的登录接口返回时确实调用了
.state('user', 你的用户数据)来绑定Cookie,不然光配置state规则是没用的。 - 可以打开浏览器控制台的「Application」标签,看看Cookie列表里有没有
user的影子,如果显示Secure但当前是HTTP环境,那百分百是isSecure的问题。
内容的提问来源于stack exchange,提问作者Shmily.HJT
相关产品推荐
相关产品推荐

