Node.js 快速会话未保存/查找会话

Node.js 快速会话未保存/查找会话,node.js,express,session,express-session,Node.js,Express,Session,Express Session,我正在使用express session尝试使用该会话,但它似乎没有找到或保存该会话 我希望每次呼叫后响应都会增加,但是,对于邮递员或基本苗条应用程序的重复请求,它会不断返回0 如何让它找到已保存的会话并返回递增的值 Node.js: const express = require('express') const app = express() const session = require('express-session'); app.use(function(req, res, nex

我正在使用express session尝试使用该会话,但它似乎没有找到或保存该会话

我希望每次呼叫后响应都会增加,但是,对于邮递员或基本苗条应用程序的重复请求,它会不断返回0

如何让它找到已保存的会话并返回递增的值

Node.js:

const express = require('express')
const app = express()
const session = require('express-session');

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "http://localhost:5000"); // update to match the domain you will make the request from
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

app.use(session({
    genid: function(req) {
        return 1
    },
    proxy: true,
    secret: "max",
    resave: false,
    saveUninitialized: true
}));

app.get('/', function (req, res) {
    console.log(req.session)
    if (!req.session.views) {
        req.session.views=0;
    }
    res.send((req.session.views++).toString());
    console.log(req.session)
})

app.listen(3000)
基本苗条:

<script>
    export let name;
    let resp = "";
    async function sendReq() {
        resp = await fetch("http://localhost:3000/");
        console.log(resp);
        resp = await resp.text();
        console.log(resp);
    }
</script>

<main>
    <h1>Hello {name}!</h1>
    <p>Visit the <a href="https://svelte.dev/tutorial">Svelte tutorial</a> to learn how to build Svelte apps.</p>
    <button on:click={sendReq}>Click me</button>
    {resp}
</main>

<style>
    main {
        text-align: center;
        padding: 1em;
        max-width: 240px;
        margin: 0 auto;
    }

    h1 {
        color: #ff3e00;
        text-transform: uppercase;
        font-size: 4em;
        font-weight: 100;
    }

    @media (min-width: 640px) {
        main {
            max-width: none;
        }
    }
</style>

出口许可证名称;
让resp=“”;
异步函数sendReq(){
resp=等待获取(“http://localhost:3000/");
控制台日志(resp);
resp=等待响应文本();
控制台日志(resp);
}
你好{name}!
访问了解如何构建苗条的应用程序

点击我 {resp} 主要{ 文本对齐:居中; 填充:1em; 最大宽度:240px; 保证金:0自动; } h1{ 颜色:#ff3e00; 文本转换:大写; 字号:4em; 字号:100; } @介质(最小宽度:640像素){ 主要{ 最大宽度:无; } }
fetch()
默认情况下,不会随请求发送cookie。因此,如果没有cookie,服务器将看不到会话cookie,然后也找不到以前的会话对象。您需要添加
凭证:“包括”
凭证:“相同来源”
选项:

resp = await fetch("http://localhost:3000/", {credentials: "include"});
在更改会话对象后,您可能还需要调用
session.save()
,以便您所做的更改能够持续

关于代码的其他一些注释:

  • 对于后面有真实数据存储的大多数会话,修改会话对象后需要调用
    session.save()
    ,以确保将其保存回数据存储。对于默认的基于内存的存储,您可能不需要这样做,但这是一种很好的常规做法,因为生产代码可能会在某个时候从基于内存的存储中移出

  • genid()
    硬编码为始终返回
    1
    将破坏会话中的一系列功能。不要那样做。
    genid()
    的默认实现可以很好地满足您的需要,因此您可以完全删除该方法定义

  • 您不显示从服务器加载网页的代码。如果您没有从web服务器获取网页本身,因此
    fetch()
    调用是一个同源调用,那么您可能还存在cors问题(跨源限制)

  • 在客户机代码中,您应该将变量
    resp
    的定义移动到
    sendReq()
    函数中,这样它就是一个局部变量,如果在同一页面上有多个对
    sendReq()
    的调用,则不会受到影响


  • 修改会话对象后,应执行
    session.save()
    。另外,为什么每次都要硬编码
    genId()
    以返回相同的id?除非您自己有特定的原因生成会话id,否则请删除此方法,并让默认行为为您工作。是的,这只是一种操场上的事情,您可以随意处理并学习express sessions,只是尝试在此时使其工作。当我设置
    凭证时:“同源”
    不会改变任何东西。但是,在设置
    凭据时:“包括”
    。我收到一个错误:
    响应中的“Access Control Allow Credentials”头的值为“”,当请求的凭据模式为“include”时,该值必须为“true”。
    此外,邮递员是否默认不保存和重新发送cookie,或者是否只是在基本的svelte应用程序中更容易测试才发现问题,看起来即使使用内存存储,也必须调用session.save()。如果您想编辑您的答案,我可以将其标记为正确。此外,还将Allow Credentials标头设置为true。@yodigi7-我没有意识到这是一个跨源请求。很高兴你弄明白了。