【问题标题】:Cannot read property of 'ID parameter'无法读取“ID 参数”的属性
【发布时间】:2020-01-29 08:59:24
【问题描述】:

这是我导入 cart.js 模型的路由器代码

var router = require('express').Router();
var Product = require('../models/products');
var Cart = require('../models/cart'); 

router.get('/add-to-cart/:_id',(req,res,next)=>{
  const productID = req.params._id;
  var cart = new Cart(req.session.cart ? req.session.cart : {});

  Product.findById(productID,(err,product)=>{
    if(err){
      res.redirect('/');
    }
    cart.add(product, product.id);
    req.session.cart = cart;
    res.redirect('/');
  })  
})

这是我的 Cart.js 代码

module.exports = function cart(oldCart){
   this.items = oldCart.items;
   this.totalQty = oldCart.totalQty;
   this.totalPrice = oldCart.totalPrice;

   this.add = function(item,id){
      var storedItem = this.items[id]; // Here is Problem
      if(!storedItem){
        storedItem = this.items[id] = {item: item, qty: 0, price: 0};
      }
      storedItem.qty++;
      storedItem.price = storedItem.item.price * storedItem.qty;
      this.totalQty++;
      this.totalPrice = storedItem.price;
   };

   this.generateArray = function(){
      var array = [];
      for (var id in this.items){
        array.push(this.items[id]);
      }
      return array;
   };
}

错误:

events.js:174 投掷者; // 未处理的“错误”事件 ^

TypeError:无法读取未定义的属性“5d9182475f539435e81a7bb9” 在 cart.add (C:\Users\Manav\Documents\Github\E_com_App\models\cart.js:7:36) 在 Product.findById (C:\Users\Manav\Documents\Github\E_com_App\routes\routes.js:85:10) 在 C:\Users\Manav\Documents\Github\E_com_App\node_modules\mongoose\lib\model.js:4589:16 在 C:\Users\Manav\Documents\Github\E_com_App\node_modules\mongoose\lib\query.js:4323:12 在 process.nextTick (C:\Users\Manav\Documents\Github\E_com_App\node_modules\mongoose\lib\query.js:2805:28) 在 process._tickCallback (internal/process/next_tick.js:61:11) 在以下位置发出“错误”事件: 在 C:\Users\Manav\Documents\Github\E_com_App\node_modules\mongoose\lib\model.js:4591:13 在 C:\Users\Manav\Documents\Github\E_com_App\node_modules\mongoose\lib\query.js:4323:12 在 process.nextTick (C:\Users\Manav\Documents\Github\E_com_App\node_modules\mongoose\lib\query.js:2805:28) 在 process._tickCallback (internal/process/next_tick.js:61:11) [nodemon] 应用程序崩溃 - 启动前等待文件更改...

查看我的完整代码:https://github.com/ma-9/E_com_NodeJS.git

【问题讨论】:

  • 请阅读关于如何提问的 SO 帖子。
  • 当询问“为什么我的代码不起作用”时,actual code is pretty much required。仅错误消息就无法告诉我们什么。请包含 最小 必要的代码以重现问题。然后有人可以真正帮助你。
  • @NeilLunn 感谢您的帮助,这是我对 StackOverflow 的第一次体验
  • 需要更多上下文。该错误基本上是告诉您this.items 是undefined,这反过来可能意味着oldCart 可能未定义。您需要显示您期望的输入,以及该函数在上下文中的用法。请阅读评论中的链接。从外部链接到完整且可能“足够大”的代码列表与所说的背道而驰。 您的问题中的必要代码。
  • @NeilLunn Check my Code

标签: node.js mongodb express mongoose body-parser


【解决方案1】:

您好,我看到了您的代码,我认为您在 Cart.js 文件和添加到购物车的路线中犯了错误。我已经解决了这个问题并向您发出拉取请求..

更新代码

module.exports = function cart(oldCart) {
this.items = oldCart.items || {};
this.totalQty = oldCart.totalQty || 0;
this.totalPrice = oldCart.totalPrice || 0;

this.add = function (item, id) {
    var storedItem = this.items[id];
    if (!storedItem) {
        storedItem = this.items[id] = { item: item, qty: 0, price: 0 };
    }
    storedItem.qty++;
    storedItem.price = storedItem.item.price * storedItem.qty;
    this.totalQty++;
    this.totalPrice = (oldCart.totalPrice || 0) + storedItem.price;
};

this.generateArray = function () {
    var array = [];
    for (var id in this.items) {
        array.push(this.items[id]);
    }
    return array;
};

当您调用 cart.add(product,product.id) 时,在您的路线中 而不是你必须调用 product._id

【讨论】:

    【解决方案2】:

    我看到你的代码,在这一行Product.findById(productID,(err,product)=>{ 你从product 模块调用findById 函数。但我只在这个文件中看到

    const mongoose = require('mongoose');
    const schema = mongoose.Schema;
    
    const productSchema = new schema({
        imagePath: {type: mongoose.Schema.Types.String, required:true},
        // imagePath2: {type: mongoose.Schema.Types.String, required:true},
        // imagePath3: {type: mongoose.Schema.Types.String, required:true},
        // imagePath4: {type: mongoose.Schema.Types.String, required:true},
        // imagePath5: {type: mongoose.Schema.Types.String, required:true},
        name: {type: mongoose.Schema.Types.String, required:true},
        desc: {type: mongoose.Schema.Types.String, required:true},
        price: {type: mongoose.Schema.Types.Number, required:true},
    });
    
    module.exports = mongoose.model("DND - Products",productSchema);
    

    您必须在本节中定义您需要的功能。例如:findById

    【讨论】:

    • 感谢您给我宝贵的时间来解决我的问题,但我仍然不清楚如何在产品模块中定义 findByID 函数而 findById 已经是 mongoose(mongoDB) 预定义的方法
    【解决方案3】:

    mongooes db 存储具有唯一 id 的数据,键是 _id

    所以编辑它

    var router = require('express').Router();
    var Product = require('../models/products');
    var Cart = require('../models/cart'); 
    
    router.get('/add-to-cart/:_id',(req,res,next)=>{
    const productID = req.params._id;
    var cart = new Cart(req.session.cart ? req.session.cart : {});
    
    Product.findById(productID,(err,product)=>{
    if(err){
      res.redirect('/');
    }
    cart.add(product, product._id);
    req.session.cart = cart;
    res.redirect('/');
    })  
    })
    

    【讨论】:

    • 不,它也会给出错误 events.js:174 throw er; // 未处理的 'error' 事件 ^ TypeError: Cannot read property '[object Object]' of undefined at cart.add (C:\Users\Manav\Documents\Github\E_com_App\models\cart.js:7:36) at Product.findById (C:\Users\Manav\Documents\Github\E_com_App\routes\routes.js:85:10) 在 C:\Users\Manav\Documents\Github\E_com_App\node_modules\mongoose\lib\model.js :4589:16
    • 未处理的“错误”事件 ^ TypeError:无法读取 cart.add 处未定义的属性“[object Object]”
    猜你喜欢
    • 1970-01-01
    • 2021-11-13
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多