在Hapi 17中切换Locale重定向时,如何传递数据库查询结果?
解决重定向时传递数据库数据的问题
看来你在Hapi.js里处理locale切换路由的重定向数据传递时遇到了麻烦——毕竟HTTP重定向是客户端跳转,新请求会丢失原请求的上下文数据,直接传肯定不行。我给你几个实用的方案,按需选择:
方案1:URL查询参数(适合简单非敏感数据)
如果你的数据库返回的是简单字符串或可序列化的小数据,可以把它编码后拼到重定向URL的查询参数里,这样目标页面就能直接拿到:
method: "GET", path: "/locale/{locale}", options: { async handler(request, h) { // 替换成你的实际数据库查询逻辑 const foo = () => { return 'blah'; }; const dbResult = foo(); // 获取用户原页面地址,优先用referrer, fallback到首页 const redirectUrl = request.headers.referer || '/'; // 把数据编码后添加到查询参数 const targetUrl = new URL(redirectUrl); targetUrl.searchParams.set('dbData', encodeURIComponent(dbResult)); // 重定向到带参数的原页面 return h.redirect(targetUrl.toString()); } }
之后在目标页面的路由里,就可以通过decodeURIComponent(request.query.dbData)解码拿到数据。
方案2:服务器会话(适合复杂/敏感数据)
如果数据比较复杂,或者不想暴露在URL里,用会话存储是最稳妥的。首先得确保你的项目配置了会话插件,比如@hapi/cookie配合@hapi/yar:
先配置会话插件
// 注册插件 await server.register([ require('@hapi/cookie'), { plugin: require('@hapi/yar'), options: { cookieOptions: { password: 'your-very-strong-password-here', // 要足够长且随机 isSecure: process.env.NODE_ENV === 'production', // 生产环境开启HTTPS isHttpOnly: true } } } ]);
在locale路由中存储数据到会话
method: "GET", path: "/locale/{locale}", options: { async handler(request, h) { const foo = () => { // 这里写你的数据库查询逻辑,返回复杂对象也没问题 return { userLocale: request.params.locale, extraData: 'from db' }; }; const dbResult = foo(); // 把数据存到会话里,设置一个唯一的key request.yar.set('localeSwitchData', dbResult); // 重定向回原页面 const redirectUrl = request.headers.referer || '/'; return h.redirect(redirectUrl); } }
在目标页面路由读取会话数据
// 举个原页面路由的例子 method: "GET", path: "/your-original-page", options: { async handler(request, h) { // 从会话中取出数据 const dbData = request.yar.get('localeSwitchData'); // 用完记得清除,避免下次请求还能拿到 request.yar.clear('localeSwitchData'); // 把数据传给模板或者返回响应 return h.view('your-page-template', { dbData }); } }
方案3:Flash消息(适合一次性提示类数据)
如果你的数据是切换成功的提示这类一次性信息,用@hapi/yar的flash消息更合适:
// 在locale路由里设置flash消息 request.yar.flash('success', `Locale切换成功!数据库返回:${dbResult}`); // 在目标页面路由里读取 const flashMessages = request.yar.flash('success'); // 之后可以把flashMessages渲染到页面上
为啥你之前的代码不行?
核心原因是HTTP重定向的响应没法携带自定义复杂数据——客户端收到重定向指令后会发起全新的GET请求,原请求里的所有变量都会被销毁,所以必须把数据存到会话或者URL参数里,让新请求能拿到。
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

