Экспресс-сеанс Nodejs возвращается неопределенным

#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}`)
})