#javascript #node.js #express #session #express-session
Вопрос:
Я ищу для хранения информации, которая хранится в сеансе, этот сеанс сначала инициализируется в маршрутизаторе индексов, где, если сеанса нет, он создаст его. Оттуда он отображает мою домашнюю страницу, на которой размещена форма. После отправки он вызывает мой маршрут /штамп, по которому я пытаюсь получить доступ к сеансу. Вот где возникает моя проблема, я возвращаюсь с неопределенным при попытке доступа req.session.stamp
. Я пытался найти проблему в течение нескольких часов, любая обратная связь была бы очень полезна
TypeError: Cannot read properties of undefined (reading 'push')
at postStamp (/Users/xilaluna/dev/projects/crypto-stamps/controllers/stamp.js:52:34)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
controllers/index.js
const getHome = async (req, res) => {
try {
if (!req.session.stamps) {
req.session.stamps = []
}
res.render("home", { stamps: req.session.stamps })
} catch (error) {
console.log(error)
}
}
module.exports = {
getHome,
}
routes/index.js
const express = require("express")
const router = express.Router()
const index = require("../controllers/index")
router.get("/", index.getHome)
module.exports = router
controllers/stamp.js
const postStamp = async (req, res) => {
try {
console.log(req.session.stamps)
const shipment = new api.Shipment({
to_address: await new api.Address({
verify: [true],
name: req.body.toName,
street1: req.body.toStreet1,
street2: req.body.toStreet2,
city: req.body.toCity,
state: req.body.toState,
zip: req.body.toZip,
country: req.body.toCountry,
phone: req.body.toPhone,
}),
from_address: await new api.Address({
verify: [true],
name: req.body.fromName,
street1: req.body.fromStreet1,
street2: req.body.fromStreet2,
city: req.body.fromCity,
state: req.body.fromState,
zip: req.body.fromZip,
country: req.body.fromCountry,
phone: req.body.fromPhone,
}),
parcel: await new api.Parcel({
length: req.body.length,
width: req.body.width,
height: req.body.height,
predefined_package: req.body.predefined_package,
weight: 10,
}),
})
const savedShipment = await shipment.save()
const carrierInfo = {
carrier: req.body.carrier,
service: req.body.service,
}
console.log(savedShipment)
res.render("cart", {stamps: req.session.stamps.push(savedShipment, carrierInfo)}
} catch (error) {
console.log(error)
}
}
module.exports = {
postStamp,
}
routes/stamp.js
const express = require("express")
const router = express.Router()
const stamp = require("../controllers/stamp")
router.post("/", stamp.postStamp)
router.get("/checkout", stamp.checkoutStamp)
router.get("/order", stamp.checkoutStamp)
module.exports = router
server.js
require("dotenv").config()
const express = require("express")
const session = require("express-session")
const store = new session.MemoryStore()
const exphbs = require("express-handlebars")
const app = express()
app.use(express.urlencoded({ extended: false }))
app.use(express.json())
app.use(
session({
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: { maxAge: 3000 },
store,
})
)
app.use(express.static("public"))
app.engine("handlebars", exphbs())
app.set("view engine", "handlebars")
const indexRouter = require("./routes/index")
const stampRouter = require("./routes/stamp")
const cartRouter = require("./routes/cart")
const orderRouter = require("./routes/order")
app.use("/", indexRouter)
app.use("/stamp", stampRouter)
app.use("/cart", cartRouter)
app.use("/order", orderRouter)
const PORT = process.env.PORT || 3000
app.listen(PORT, () => {
console.log(`Server listening on port : ${PORT}`)
})