session - Sapper/svelte3 session 在没有页面重新加载的情况下不同步

标签 session sapper svelte-3

我无法让 Sapper 在没有页面加载的情况下同步在我的服务器端路由中所做的 session 更改。我的示例场景是我在 session 中没有用户的情况下加载我的应用程序,我的服务器端登录路由将用户设置为 session ,我使用 goto到仪表板。

问题在于session仪表板的预加载函数中的参数未填充。如果我使用 window.location.href = '/dashboard' ,是的,因为它贯穿了 Sapper 的 page_handler .但是如果我只进行客户端重定向,Sapper 不会将更新的 session 发送到客户端。

有什么办法解决这个问题吗?我使用我的工具有误吗?

注意:我正在使用 connect-pg-simple 和 express-session,像这样设置工兵:sapper.middleware({session: (req, res) => req.session.public}) .

最佳答案

我在 Sapper docs 中找到了我的答案

session contains whatever data was seeded on the server. It is a writable store, meaning you can update it with new data (for example, after the user logs in) and your app will be refreshed.



从字里行间看,这表明您的应用程序必须手动同步 session 数据。

此处的解决方案是使用 Webhook 连接、响应 header 或响应数据中的键手动将 session 数据同步到客户端。

我有一个装饰器,用于创建服务器路由处理程序,在其中将 session 数据添加到响应中。这是一个简化版本:
const createHandler = getData => (req, res) => {
  res.status(200).json({data: getData(req.body), session: req.session.public})
}

显然还有更多的东西,例如错误处理,但你明白了。在客户端,我包装 fetch在一个辅助函数中,我总是使用它来获取我的 json,设置正确的标题等。在其中,我查看响应,如果有 session属性,我将其设置为 session 存储,以便它在我的 preload 中可用s。
import {stores} from "@sapper/app"

const myFetch = (...args) => fetch(...args).then(r => r.json()).then(body => {
  if (body.session) stores().session.set(body.session)

  return body.data
})

关于session - Sapper/svelte3 session 在没有页面重新加载的情况下不同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57514247/

相关文章:

session - 如何在 Angular JS 应用程序中处理身份验证

apache - 我如何获得 apache httpd session ID

javascript - Sapper 不断从客户端收到有关 'this' 关键字的警告?

jquery - 如何在 Svelte 中使用 jQuery

svelte - 这个 vite 错误是什么意思?语法错误 : Unexpected token (6:180) at Object. pp$4.raise

mysql - 解锁 Oracle 表

java - JSP 中的 session 变量

javascript - Svelte:如何仅在 promise 未挂起时显示某些内容?

ionic-framework - 如何使用 Ionic 设置 Svelte.js?

if-statement - Svelte 中是否有更好的方法来包含条件 HTML 元素