Express.js - 请求和响应未定义

时间:2021-07-30 05:37:56

标签: node.js mongodb express

每当我尝试运行此代码时,它总是显示 cannot read property 'cookie' of undefined 而这里的 undefinedrequest 对象。即使我尝试渲染某些内容,它也会显示无法 read property render 的响应对象。所以,我无法理解为什么我的 request(req)response(res) 对象是 undefined。如果我正常运行而不是在 MVC 模式中,此代码可以正常工作。

index.js

const express = require('express')
const ejs = require('ejs')
const session = require('express-session')
const cookieparser = require('cookie-parser')
const mongoconnect = require('./util/database').mongoconnect

const index = require('./routes/index')
const products = require('./routes/product')

const app = express()

app.use(express.static('public'))
app.use(express.urlencoded({ extended: false }))
app.use(express.json())
app.use(cookieparser())
app.use(session({
    secret: 'secret',
    saveUninitialized: false,
    resave: false
}))

app.set('view engine', 'ejs')
app.use('/products', products)
app.use('/', index)


mongoconnect(client => {
    console.log(client)
    app.listen(3000, err => {
        if(err)
        console.log(err)
    })
})

routes/products.js

const express = require('express')
const router = express.Router()
const product = require('../controller/product.js')
const isseller = require('../middleware/auth.js')
const isuser = require('../middleware/auth.js')

router.get('/addproduct', isseller, product.getAddproduct())

router.post('/addproduct', isseller, product.postAddproduct())

router.get('/myproducts', isseller, product.getMyproducts())

router.get('/edit/:productID', isseller, product.getEditproduct())

router.post('/edit/:productID', isseller, product.postEditproduct())

router.delete('/delete/:productID', isseller, product.deleteproduct())

router.get('/:productID', product.getProduct())

router.get('/:productID/reviews', product.getProductreviews())

router.get('/:productID/reviews/create', isuser, product.getCreatereview())

router.post('/:productID/reviews/create', isuser, product.postCreatereview())

module.exports = router

controllers/products.js

const product = require("../models/product")

let prodname = ""
let proddesc = ""
let prodcategory = ""
let prodprice = ""
let userid = 0
let productID = 0
let review = ""
let reviewdate = ""
let insertid = ""

exports.getAddproduct = (req, res, next) => {
    res.render('addproduct.ejs')
}

exports.postAddproduct = (req, res, next) => {
    prodname = req.body.name
    proddesc = req.body.desc
    prodcategory = req.body.category
    prodprice = parseInt(req.body.price)

    userid = req.cookies.logininfo.userid

    const product = new product(prodname, proddesc, prodcategory, prodprice, userid)
    product
        .save()
        .then(result => {
            console.log(result)
        })
        .catch(err => {
            console.log(err)
        })
}

exports.getMyproducts = (req, res, next) => {
    userid = req.cookies.logininfo.userid
        
}

exports.getEditproduct = (req, res, next) => {
    productID = parseInt(req.params.productID)
        
}

exports.postEditproduct = (req, res, next) => {
    prodname = req.body.name
    proddesc = req.body.desc
    prodcategory = req.body.category
    prodprice = parseInt(req.body.price)
    productID = req.params.productID

    
}

exports.deleteproduct = (req, res, next) => {
    
}

exports.getProduct = (req, res, next) => {
    productID = req.params.productID
        
}

exports.getProductreviews = (req, res, next) => {
    
}

exports.getCreatereview = (req, res, next) => {
    res.render('createreview')
}

exports.postCreatereview = (req, res, next) => {
    review = req.body.review
    productID = parseInt(req.params.productID)

    const d = new Date()
    reviewdate = reviewdate.concat(d.getDate().toString(), "-",  (d.getMonth() + 1).toString(), "-", d.getFullYear().toString())

models/products.js

const getDb = require('../util/database').getDb

class product {
    constructor(prodname, proddesc, prodcategory, prodprice, userid) {
        this.prodname = title
        this.proddesc = price
        this.prodcategory = description
        this.prodprice = imageUrl
        this.userid = userid
    }

    save() {
        const db = getDb()
        return db.collection('products')
          .insertOne(this)
          .then(result => {
              console.log(result)
          })
          .catch(err => {
              console.log(err)
          })
    }
}

module.exports = product

util/database.js

const mongodb = require('mongodb')
const mongoclient = mongodb.MongoClient

let _db

const mongoconnect = callback => {
    mongoclient
        .connect('mongodb+srv://user1:aa@cluster0.z0jq8.mongodb.net/shop?retryWrites=true&w=majority')
        .then(client => {
            console.log("connected!")
            _db = client.db()
            callback()
        })
        .catch(err => {
            console.log(err)
        })
    }

const getDb = () => {
    if(_db)
    return _db
    throw 'No Database Found!'
}

exports.mongoconnect = mongoconnect
exports.getDb = getDb

1 个答案:

答案 0 :(得分:0)

不要在你的路由中调用该函数,而是将其作为

router.delete('/delete/:productID', isseller, product.deleteproduct) //Without ()