当前位置: 首页 > 知识库问答 >
问题:

ExpressJS:TypeError:当试图将文件上载到cloudinary并将url保存到mongoDB时,无法读取未定义的属性“path”

屠晟睿
2023-03-14

我正试图通过POST请求将一个文件上传到cloudinary并将url保存到mongodb

下面是我的前端代码:

         <form action="/add-product?_csrf=<%=csrfToken%>" class="form-control col s12" method="POST" enctype="multipart/form-data">
            <div class="row">
               
                <div class="input-field">
                    <label for="title">Name</label>
                    
                    <br>
                    <input type="text" id="name" name="name" required> 
                    
                </div>
            </div>


            <div class="row">
                <div>
                    <% if (categories.length > 0) { %>
                        <label for="category"><h5>Category</h5></label>
                    <select id="status" name="status">
                            
                        <% categories.forEach(category => { %>
                        <option value="category"><%= category.category %></option>
                       <% }) %>
                    </select>
                   
                    <% } else { %> 
                        <p>There are no categories to select</p>
                        <% } %>
                </div>
            </div>

    
            <div class="row">
                <div class="input-field" id="ckeditor">
                    <h5>Product Description</h5>
                    <textarea id="body" name="description"></textarea>
                </div>
            </div>
    
    
            <div class="row">
               
                <div class="input-field">
                    <label for="image"> Upload Product Image</label>
                    <br>
                    <br>
                    <input type="file" name="image">
                    
                </div>
            </div>

    
            <div class="row">
               
                <div class="input-field">
                    <label for="price">Price</label>
                    <br>
                    
                    <input type="number" id="price" name="price">
                </div>
            </div>
    
            <div class="row">
                <input type="submit" value="Save" class="btn">
                <a href="/" class="btn orange">Cancel</a>
            </div>
            

        </form>

我在express服务器上的此页路由:

//get the link to add a product to the eccomerce application using a GET request
router.get('/add-product',  ensureAuth, csrfProtection, async (req,res) =>{

    try {
       const categories  = await Category.find().sort({createdAt:-1})
       //console.log(categories)
       res.render('addproduct',{categories:categories,csrfToken:req.csrfToken()})

    } catch (err) {
        console.error(err)
        res.render('error/500')
        
    }
})

//post the filled form
router.post('/add-product',ensureAuth, parseForm, csrfProtection,async (req,res)=>{
    try {
         // Upload image to cloudinary
         console.log(req)
         console.log(req.file)
    const result = await cloudinary.uploader.upload(req.file.path, function(err,res){
        console.error(err);
    });
    //assert the populate db relationship
        req.body.user = req.user.id

        let Product = new product({
            category: req.body.category,
            name: req.body.name,
            image: result.secure_url,
            description:req.body.description,
            price:req.body.price,
            
        })
       await Product.save()
        res.redirect('/')
        
    } catch (err) {
        console.error(err)
        res.render('error/500')
    }
})

然而,在填写表单字段后试图发布请求时,我得到了错误:


undefined
TypeError: Cannot read property 'path' of undefined
    at router.post (/home/e-wave/Desktop/nodecommerce/routes/eroutes.js:131:62)
    at Layer.handle [as handle_request] (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/route.js:137:13)
    at csrf (/home/e-wave/Desktop/nodecommerce/node_modules/csurf/index.js:117:5)
    at Layer.handle [as handle_request] (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/route.js:137:13)
    at urlencodedParser (/home/e-wave/Desktop/nodecommerce/node_modules/body-parser/lib/types/urlencoded.js:100:7)
    at Layer.handle [as handle_request] (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/route.js:137:13)
    at ensureAuth (/home/e-wave/Desktop/nodecommerce/middleware/auth.js:4:20)
    at Layer.handle [as handle_request] (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/layer.js:95:5)
    at /home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/home/e-wave/Desktop/nodecommerce/node_modules/express/lib/router/index.js:335:12)
const cloudinary = require("cloudinary").v2;
const  {cloudStorage} = require('multer-storage-cloudinary');
const dotenv = require('dotenv').config({path:__dirname+'/.env'});

cloudinary.config({
    cloud_name: process.env.CLOUD_NAME,
    api_key: process.env.API_KEY,
    api_secret: process.env.API_SECRET,
  }); 
  


module.exports = cloudinary
const cloudinary = require("../utils/cloudinary");

共有1个答案

陆安国
2023-03-14

问题解决了,显然我没有使用任何中间件(在本例中是multer)来管理上传的文件。

代码段

我必须在utils文件夹中创建一个multer.js文件


    const multer = require("multer");
    const path = require("path"); 
    // Multer config
    module.exports = multer({
      storage: multer.diskStorage({}),
      fileFilter: (req, file, cb) => {
        let ext = path.extname(file.originalname);
          if (ext !== ".jpg" && ext !== ".jpeg" && ext !== ".png") {
          cb(new Error("File type is not supported"), false);
          return;
        }
        cb(null, true);
      },
    });

然后在express server文件夹中要求此模块

const upload = require("../utils/multer");

然后在add-product POST请求中作为中间件添加


    router.post('/add-product', upload.single("image"),ensureAuth, parseForm, csrfProtection,async (req,res)=>{
        try {
             // Upload image to cloudinary
        const result = await cloudinary.uploader.upload(req.file.path);
        //assert the populate db relationship
            req.body.user = req.user.id
    
            let Product = new product({
                category: req.body.category,
                name: req.body.name,
                image: result.secure_url,
                description:req.body.description,
                price:req.body.price,
                
            })
           await Product.save()
            res.redirect('/')
            
        } catch (err) {
            console.error(err)
            res.render('error/500')
        }
    })

 类似资料:
  • 我有这个错误 TypeError[ERR_INVALID_ARG_TYPE]:“chunk”参数必须是string类型或Buffer实例。接收到Object的实例 但我不知道怎么解决: 下面是我的代码库: 谢谢任何帮助我解决这个问题的人

  • 我想上传文件并保存到特定的目录。而且我对文件的概念是陌生的。当我从我的页面上传文件时,它们保存在另一个目录(C:\ Users \ ROOTCP ~ 1 \ AppData \ Local \ Temp \ multipartbody 989135345617811478 astemporary file)而不是指定的目录。我不能设置它。请帮我找到解决办法。提前感谢所有的帮助。 上传的文件为什么保

  • TypeError:无法读取app.post(/var/www/html/express/simplecrud/server.js:20:21)层未定义的属性“collection”。处理[as handle_request](/var/www/html/express/simplecrud/node_modules/express/lib/router/layer.js:95:5)层的下一个(/

  • 问题内容: 我正在按照本教程进行操作,并且在 将值从一个组件的状态传递到另一个组件 时遇到了一个问题。 当执行组件中的功能时,将引发错误。 什么会导致的是从路过的时候到? 问题答案: 首先,设置更安全的初始数据: 并确保您的ajax数据。 如果您按照上面的两个指示(如“ 演示”)操作,它应该可以工作。 更新:您可以仅使用条件语句包装.map块。

  • 我正在编写一个应用程序,它从url下载图像,然后使用AWS-SDK将其上传到S3桶中。 以前,我只是下载图像并将它们保存到磁盘上,就像这样。 然后像这样将图像上传到AWS S3 但我想跳过将映像保存到磁盘的部分。有什么方法可以响应从到一个变量,然后上传它吗?

  • 问题内容: 是否可以将JSON数据保存到本地文本文件中?因此,稍后我可以通过加载该文件再次使用它,并取回存储的JSON数据。其实我真正想做的是在文本文件中导出JSON数据,以便以后可以用作import.Any的建议或解决方案? 这是我要用于导出到文本的一些示例。 http://jsfiddle.net/k56eezxp/ 问题答案: 是否可以将JSON数据保存到本地文本文件中? 是。当前,链接的j