首页 > 解决方案 > Nodejs Express:无法读取 null 和未处理错误事件的属性“图像”

问题描述

我试图找出错误在哪里。任何人都可以请帮助这个。如果我尝试提交没有图像的帖子,则会出现此错误而不是 Flash 消息:

和源代码链接:https ://github.com/rizvi770/cart.git

TypeError: Cannot read property 'image' of null
    at /Users/rizvi/Desktop/cart/routes/admin_products.js:115:37
    at Layer.handle [as handle_request] (/Users/rizvi/Desktop/cart/node_modules/express/lib/router/layer.js:95:5)
    at next (/Users/rizvi/Desktop/cart/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/Users/rizvi/Desktop/cart/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/Users/rizvi/Desktop/cart/node_modules/express/lib/router/layer.js:95:5)

并在提交包含架构的所有详细信息的帖子时,会出现以下错误:

events.js:298
      throw er; // Unhandled 'error' event
      ^

TypeError: invalid options argument
    at optsArg (/Users/rizvi/Desktop/cart/node_modules/mkdirp/lib/opts-arg.js:13:11)
    at mkdirp (/Users/rizvi/Desktop/cart/node_modules/mkdirp/index.js:11:10)
    at /Users/rizvi/Desktop/cart/routes/admin_products.js:175:19
    at /Users/rizvi/Desktop/cart/node_modules/mongoose/lib/model.js:4827:16
    at /Users/rizvi/Desktop/cart/node_modules/mongoose/lib/helpers/promiseOrCallback.js:24:16
    at /Users/rizvi/Desktop/cart/node_modules/mongoose/lib/model.js:4850:21
    at model.<anonymous> (/Users/rizvi/Desktop/cart/node_modules/mongoose/lib/model.js:490:7)
    at /Users/rizvi/Desktop/cart/node_modules/kareem/index.js:315:21
    at next (/Users/rizvi/Desktop/cart/node_modules/kareem/index.js:209:27)
    at /Users/rizvi/Desktop/cart/node_modules/kareem/index.js:182:9
    at /Users/rizvi/Desktop/cart/node_modules/kareem/index.js:507:38
    at processTicksAndRejections (internal/process/task_queues.js:79:11)
Emitted 'error' event on Function instance at:
    at /Users/rizvi/Desktop/cart/node_modules/mongoose/lib/model.js:4829:13
    at /Users/rizvi/Desktop/cart/node_modules/mongoose/lib/helpers/promiseOrCallback.js:24:16
    [... lines matching original stack trace ...]

这是我将产品发布到数据库的路线:


router.post('/add-product',function(req,res){

   var imageFile = typeof req.files.image !== "undefined" ? req.files.image.name: "";

    req.checkBody('title','title must have value').notEmpty();
    req.checkBody('desc','Description must have value').notEmpty();
    req.checkBody('price','Price must have value').isDecimal();
    req.checkBody('image','You must upload an image').isImage(imageFile); 


    var title = req.body.title;
    var slug = title.replace(/\s+/g,'-').toLowerCase();
    var desc = req.body.desc;
    var price = req.body.price;
    var category = req.body.category;


    var errors = req.validationErrors();
    if(errors){ 
        Category.find(function(err, categories){
            res.render('admin/add_product', {
                errors : errors,
                title : title,
                desc : desc,
                categories : categories,
                price: price
            });
          });

    } else{ 
        Product.findOne({slug : slug}, function(err,product){


            if (product){
               req.flash('danger', ' This Product title already exists, choose another!!' );
               Category.find(function(err, categories){
               res.render('admin/add_product', {
                    title : title,
                    desc : desc,
                    categories : categories,
                    price: price
                });
              });

            } else {
                var price2 = parseFloat(price).toFixed(2);

                var product = new Product({

                   title: title,
                   slug : slug,
                   desc : desc,
                   price: price2,
                   category : category,
                   image: imageFile

                });
                product.save(function(err){

                if (err) 
                return console.log(err);

                  mkdirp('public/product_images/'+product._id, function(err){

                    return console.log(err);
                  });
                  mkdirp('public/product_images/'+product._id, function(err){

                    return console.log(err);
                  });
                  mkdirp('public/product_images/'+product._id + '/gallery', function(err){

                    return console.log(err);
                  });
                  mkdirp('public/product_images/'+product._id + '/gallery/thumbs', function(err){

                    return console.log(err);
                  });
              if (imageFile != ""){

                var productImage = req.files.image;
                var path = 'public/product_image/' + product._id + '/' + imageFile;

                productImage.mv(path, function(err){

                    return console.log(err);
                });

              }

                 req.flash('succes', 'product added!!');
                 res.redirect('/admin/products');
                });
            }
        }); 
    }


}); 

这是我的验证中间件:


customValidators:  {

     isImage: function(value, filename){
       var extension = (path.extname(filename)).toLowerCase();

       switch(extension){
        case '.jpg':
            return '.jpg';
        case '.jpeg':
            return '.jpeg'; 
        case '.png':
            return '.png'; 
        case '.':
            return 'jpg'; 

        default:
            return false; 
       }
     } 

    }

这是我的 app.js 的公共文件夹设置

// View Engine Setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

// Set Public folder
app.use(express.static(path.join(__dirname,'public')));
app.use(express.static(__dirname + "/public"));

标签: javascriptnode.jsexpress

解决方案


在这里用 let 改变 var:

 let imageFile = typeof req.files.image !== "undefined" ? req.files.image.name: "";

对于 mkdirp:

 product.save( (err)=> {
                
                if (err)
                    return console.log(err);

                mkdirp('public/product_images/' + product._id).then((err)=>console.log(err));

                mkdirp('public/product_images/' + product._id + '/gallery').then((err)=>console.log(err));
                
                mkdirp('public/product_images/' + product._id + '/gallery/thumbs').then(
                    (err) => {
                        console.log(err);
                        if (imageFile != "") {
                            var productImage = req.files.image;

                            var path = 'public/product_images/' + product._id + '/' + imageFile;

                            productImage.mv(path, (err) => {
                                return console.log(err);
                            });
                        }
                    }
                );
                req.flash('success', 'Product added!');
                res.redirect('/admin/products');
            });
        }

推荐阅读