【发布时间】: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