【问题标题】:Setting and retrieving session works in Postman but not working in browser设置和检索会话在 Postman 中有效,但在浏览器中无效
【发布时间】:2023-02-01 16:05:47
【问题描述】:

我正在使用 express-session 处理这个 NodeJS 项目,为我的应用程序创建会话。问题是,当我向http://localhost:5500/login 发出post 请求时,会创建一个会话,其中包含我有意添加的附加属性userid。然后,当我使用 Postman 向 http://localhost:5500/ 发出 get 请求时,应用程序实际上接收到具有属性 userid 的会话,并根据 userid 是否设置将用户重定向到他的主页。但是,如果我从 Chrome 之类的浏览器向 get 请求 http://localhost:5500/,我的服务器将无法使用我在成功登录时添加的附加属性“userid”获取会话,并且不会将我的用户重定向到他的主页。谁能解释为什么会这样?谢谢

这是我index.js的代码 `

const express = require("express")
const app = express()
const PORT = process.env.PORT || 5500
const session = require("express-session")
const { routers } = require("./routes/routes")
const mongoose = require("mongoose")
const cookieParser = require("cookie-parser")

const TIME = 1000 * 60 * 5
app.use(cookieParser())
app.use(
    session({
        secret: "iamnamdo1234567",
        saveUninitialized: true,
        cookie: { maxAge: TIME, sameSite: "strict" },
        resave: false
    })
)
const URI = process.env.DB_CONNECTION
app.use(express.urlencoded({ extended: true }))
app.use(express.json())
app.use("/api", routers)
app.get("/", (req, res) => {
    let session = req.session.userid
    session ? res.status(200).send("Hello my friend, you are logged in") : res.status(400).send("You need to log in")
})

mongoose.connect(URI, { useNewUrlParser: true.valueOf(), useUnifiedTopology: true }, err => {
    if (err) {
        console.log(err)
    } else {
        console.log("database connected")
    }
})
app.listen(PORT, () => {
    console.log(`Go to http://localhost:${PORT}`)
})

`

这是我routes.js的代码 `

const express = require("express")
const route = express.Router()
const { User } = require("../models/User")
const bcrypt = require("bcrypt")

const errorHandler = (type, error) => {
    if (type === "register") {
        if (error.code === 11000) {
            return { message: "Username has been taken" }
        } else if (error._message === "User validation failed") {
            return { message: error.errors.username?.properties.message || error.errors.password?.properties.message }
        }
    } else if (type === "login") {
        return { message: `${error}` }
    }
}

route.post("/register", async (req, res) => {
    try {
        const { username, password } = req.body
        const user = await User.create({ username, password })
        res.status(200).send("User has been created successfully")
    } catch (error) {
        // console.log(error)
        let message = errorHandler("register", error)
        res.status(400).send(message)
    }
})
route.post("/login", async (req, res) => {
    const { username, password } = req.body
    try {
        const user = await User.findOne({ username })
        if (!user) {
            throw (new Error().message = "Username not found")
        }
        const checkPassword = await bcrypt.compare(password, user.password)
        if (checkPassword === false) {
            throw (new Error().message = "Password is incorrect")
        } else {
            req.session.userid = user.username
            console.log(req.session.userid)
            res.status(200).send("Logged in")
        }
    } catch (error) {
        let message = errorHandler("login", error)

        res.status(400).send(message)
    }
})
route.post("/logout", (req, res) => {
    req.session.destroy()
    res.redirect("/")
})
module.exports.routers = route

`

当从浏览器发出 get 请求时,我试图访问会话

【问题讨论】:

  • localhost中运行时,cookie中的secure参数应该设置为false。你可以这样做,secure: process.env.NODE_ENV === 'production'
  • 我将 secure: false 添加到会话中,但它在浏览器中仍然不起作用(邮递员工作正常)。

标签: javascript node.js express session postman


【解决方案1】:

如果会话详细信息在 Postman 中可见但在浏览器中不可见,则可能是由于多种原因造成的,其中之一是 Cookie 策略。 默认情况下,cookie 仅随对与当前页面相同来源的请求一起发送。要使用跨域请求发送 cookie,您需要在 Axios 中设置 withCredentials 选项。试试这个对我有用

const axios = require('axios');

axios.defaults.withCredentials = true;

【讨论】:

    猜你喜欢
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2016-07-11
    • 2020-07-31
    • 2021-11-12
    • 2018-06-30
    • 1970-01-01
    相关资源
    最近更新 更多