"path" 参数必须是字符串类型或 Buffer 或 URL 的实例。收到未定义

Posted

技术标签:

【中文标题】\"path\" 参数必须是字符串类型或 Buffer 或 URL 的实例。收到未定义【英文标题】:The \"path\" argument must be of type string or an instance of Buffer or URL. Received undefined 【发布时间】:2021-06-10 02:42:00 【问题描述】:

美好的一天,我是编码新手,遇到了一个我自己无法解决的奇怪问题,请参阅下面的代码。 我正在开发一个电子商务网站,我编写的代码与视频中显示的相同,但仍然面临这个问题

const router = require('express').Router()
const cloudinary = require('cloudinary')
const auth = require('../middleware/auth')
const authAdmin = require('../middleware/authAdmin')
const fs = require('fs')


// we will upload image on cloudinary
cloudinary.config(
    cloud_name: process.env.CLOUD_NAME,
    api_key: process.env.CLOUD_API_KEY,
    api_secret: process.env.CLOUD_API_SECRET
)

// Upload image only admin can use
router.post('/upload',auth , authAdmin, (req, res) =>
    try 
        if(!req.files || Object.keys(req.files).length === 0)
            return res.status(400).json(msg: 'No files were uploaded.')
        
        const file = req.files;
       console.log(file)
        if(file.size > 1024*1024) 
            removeTmp(file.tempFilePath)
            return res.status(400).json(msg: "Size too large")
        

        if(file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/png')
            removeTmp(file.tempFilePath)
            return res.status(400).json(msg: "File format is incorrect.")
        

        cloudinary.v2.uploader.upload(file.tempFilePath, folder: "test", async(err, result)=>
            if(err) throw err;

            removeTmp(file.tempFilePath)

            res.json(public_id: result.public_id, url: result.secure_url)
        )


     catch (err) 
        return res.status(500).json(msg: err.message)
    
)

const removeTmp = (path) =>
    fs.unlink(path, err=>
        if(err) throw err;
    )


module.exports = router

我收到一个错误:


    "msg": "The \"path\" argument must be of type string or an instance of Buffer or URL. Received undefined"

我在第 21 行使用控制台:


  '': 
    name: 'adidas.jpg',
    data: <Buffer >,
    size: 12302,
    encoding: '7bit',
    tempFilePath: 'C:\\Users\\back-end\\tmp\\tmp-1-1615519087170',
    truncated: false,
    mimetype: 'image/jpeg',
    md5: '262073b93fdb5aa3f9dff6b5a010f2ed',
    mv: [Function: mv]
  

我无法找到错误的解决方案,因为我是编码新手感谢您的帮助

【问题讨论】:

【参考方案1】:

好像file/req.files 是一个数组的数组。 file 的第一个元素的键是否等于空字符串 ('')?


  '': 
    ...
    tempFilePath: 'C:\\Users\\back-end\\tmp\\tmp-1-1615519087170',
    ...
  

假设第一个键是空字符串,那么访问tmpFilePath 将是:

file[""].tempFilePath

【讨论】:

以上是关于"path" 参数必须是字符串类型或 Buffer 或 URL 的实例。收到未定义的主要内容,如果未能解决你的问题,请参考以下文章

控制台中的电子错误““路径”参数必须是字符串类型”

npm 发布失败,并显示““路径”参数必须是字符串类型。收到未定义”

GCP Secret Manager 抛出:“路径”参数必须是字符串类型

“路径”参数必须是字符串类型。收到未定义。未能验证 1 份合同

如何使用fread函数循环读取二进制文件

如何解决:“路径”参数必须是字符串类型。运行'vue add vuetify'时收到类型未定义'