【问题标题】:Getting a "Cannot read property of undefined" error收到“无法读取未定义的属性”错误
【发布时间】:2022-01-19 14:10:45
【问题描述】:

我正在尝试以动态方式检索随机值 (id),以便将来能够找到特定产品(我正在学习 udemy 的 nodejs 课程,讲师正在建立在线商务以网页为例)。我一遍又一遍地查看了讲师在视频上编写的代码,以确保错误不在语法末尾,显然不是因为所有内容都完全按照视频中显示的那样编写,但我不断收到错误,如果有人可以帮忙请!我不知道它可能是什么,因为此时我明白错误可能在它的逻辑端,我不知道我是否可能没有很好地理解逻辑,因此我犯了错误对我来说还不是很明显。

我会给社区一些代码,所以你们可以给我一个hdn,谢谢大家!

控制台报错:

TypeError: Cannot read property 'productId' of undefined
    at exports.getProduct (C:\Users\TOMAS\Desktop\node js MVC\controllers\shop.js:14:29)
    at Layer.handle [as handle_request] (C:\Users\TOMAS\Desktop\node js MVC\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\TOMAS\Desktop\node js MVC\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Users\TOMAS\Desktop\node js MVC\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Users\TOMAS\Desktop\node js MVC\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\TOMAS\Desktop\node js MVC\node_modules\express\lib\router\index.js:281:22
    at param (C:\Users\TOMAS\Desktop\node js MVC\node_modules\express\lib\router\index.js:354:14)
    at param (C:\Users\TOMAS\Desktop\node js MVC\node_modules\express\lib\router\index.js:365:14)
    at Function.process_params (C:\Users\TOMAS\Desktop\node js MVC\node_modules\express\lib\router\index.js:410:3)
    at next (C:\Users\TOMAS\Desktop\node js MVC\node_modules\express\lib\router\index.js:275:10)

product.js 文件:

const fs = require('fs');
const path = require('path');

const p = path.join(
    path.dirname(process.mainModule.filename), 
    'data', 
    'products.json'
);

const getProductsFromFile = cb =>{
    fs.readFile(p, (err, fileContent) => {
        if(err) {
            cb([]);
        } else{
            cb(JSON.parse(fileContent));
        }
    });
}

module.exports = class Product {
    constructor(title, imageUrl, description, price) {
        this.title = title;
        this.imageUrl = imageUrl;
        this.description = description;
        this.price = price;
    }

    save() {
        this.id = Math.random().toString();
        getProductsFromFile(products => {
            products.push(this);
            fs.writeFile(p, JSON.stringify(products), (err) => {
                console.log(err);
            });
        });
    }

    static fetchAll(cb) {
       getProductsFromFile(cb);
    };
};

shop.js 文件:

const Product = require('../models/product');

exports.getProducts = (req, res, next) => {
  Product.fetchAll(products => {
    res.render('shop/product-list', {
      prods: products,
      pageTitle: 'All Products',
      path: '/products'
    });
  });
};

exports.getProduct = (res, req, next) => {
  const prodId = req.params.productId;
  console.log(prodId);
  res.redirect('/');
};

exports.getIndex = (req, res, next) => {
  Product.fetchAll(products => {
    res.render('shop/index', {
      prods: products,
      pageTitle: 'Shop',
      path: '/'
    });
  });
};

exports.getCart = (req, res, next) => {
  res.render('shop/cart', {
    path: '/cart',
    pageTitle: 'Your Cart'
  });
};

exports.getOrders = (req, res, next) => {
  res.render('shop/orders', {
    path: '/orders',
    pageTitle: 'Your Orders'
  });
};

exports.getCheckout = (req, res, next) => {
  res.render('shop/checkout', {
    path: '/checkout',
    pageTitle: 'Checkout'
  });
};

product-list.ejs 文件:

<%- include('../includes/head.ejs') %>
<link rel="stylesheet" href="/css/products.css">
</head>
<body>
<%- include('../includes/navigation.ejs') %>
    <main>
        <% if (prods.length > 0) {%>
        <div class="grid">
            <div class="card">
                <% for (let product of prods) { %>
                <article class="product-item">
                    <header class="card__header">
                        <h1 class="product__title"> <%= product.title %> </h1>
                    </header>
                    <div class="card__image">
                        <img src="<%= product.imageUrl %>", alt="">
                    </div>
                    <div class="card__content"> 
                        <h2 class="product__price"> $<%= product.price %> </h2>
                        <p class="product__description"> <%= product.description %> </p>
                    </div>
                    <div class="card__actions">
                        <a href="/products/<%= product.id %>" class="btn">Details</a>
                        <form action="/add-to-cart" method="POST">
                            <button class="btn"> Add to Cart </button>
                        </form>
                    </div> 
                </article>
                <% } %>
            </div>
        </div>
        <% } else { %>
            <h1>No Products</h1>
        <% } %>
    </main>
<%- include('../includes/end.ejs') %>

users.js 文件:

const path = require('path');

const express = require('express');

const shopController = require('../controllers/shop');

const router = express.Router();

router.get('/', shopController.getIndex);

router.get('/products', shopController.getProducts);

router.get('/products/:productId', shopController.getProduct);

router.get('/cart', shopController.getCart);

router.get('/orders', shopController.getOrders);

router.get('/checkout', shopController.getCheckout);

module.exports = router;

【问题讨论】:

    标签: javascript node.js error-handling ejs


    【解决方案1】:

    shop.js 中,您需要交换您的reqres,您的请求首先出现,然后是响应,然后是下一个。

    exports.getProduct = (req, res, next) => {
      const prodId = req.params.productId;
      console.log(prodId);
      res.redirect('/');
    };
    

    【讨论】:

      【解决方案2】:

      基础

       at exports.getProduct (C:\Users\TOMAS\Desktop\node js MVC\controllers\shop.js:14:29)
      

      您在 shop.js 第 14 行有错误。意思是:

       const prodId = req.params.productId;
      

      req 或 params 未定义且

      TypeError: Cannot read property 'productId' of undefined
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-26
        • 2021-06-02
        • 2021-07-06
        • 2021-10-01
        • 2021-03-03
        相关资源
        最近更新 更多