You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:13:36