【问题标题】:req.files is undefined using express-fileuploadreq.files 未使用 express-fileupload 定义
【发布时间】:2020-07-14 10:10:53
【问题描述】:

我正在创建一个博客,所以想为每篇文章上传一张图片。为此,我使用了快速文件上传。使用 nodejs 我已经完成以下操作,将客户端发送的图像保存在 MongoDB 中。当我在控制台中打印req.files 的值时,我得到undefined

exports.addPost = (req, res) => {
    const file = req.files.file
    const post = new Blog()
    post.title = req.body.title
    post.des = req.body.des
    post.file = file
    post.save((err, doc) => {
        if (!err) {
            res.send(doc)
        } else {
            console.log(err)
        }
    })
}

在反应中,我有 Addpost.js 设置状态并按如下方式处理表单提交:

const Addpost=()=> {
    const [title, settitle] = useState('')
    const [des, setdes] = useState('')
    const [file, setfile] = useState('');
    
    const {addPost}=useContext(Globalcontext)
    
    const handleSubmit = (e)=>{
        e.preventDefault()
        const formData = new FormData()
        formData.append('file',file)
        const addedValue={
            title,
            des,
            formData
        }
        addPost(addedValue)
        settitle('')
        setdes('')
        setfile('')
    }
    
    const onChange=(e)=>{
        const file=e.target.files[0]
        setfile(file)
    }
    
    return (
        <div>
            <form onSubmit={handleSubmit} encType="multipart/form-data">
                <input type="text" name="title" value={title} onChange={(e)=>settitle(e.target.value)}/>
                <input type="text" name="des"value={des} onChange={(e)=>setdes(e.target.value)}/>
                <input type="file" name="file" onChange={onChange}/>
                <button type='submit' value='submit'>Add Post</button>
            </form>
        </div>
    )
}

AXIOS 发布请求发送为:

function addPost(postdetail) {
    axios.post('http://localhost:4000/blog', postdetail).then(res => {
        dispatch({
            type: 'ADD_DATA',
            payload: res.data
        })
    }).catch(error => {
        console.log(error)
    })
}

我收到错误:

Cannot read property 'file' of undefined

【问题讨论】:

标签: node.js reactjs mongodb express mern


【解决方案1】:

1.可能你没有注册中间件。

根据doc example,你应该在引用req.files之前注册express-fileupload中间件:

const express = require('express');
const fileUpload = require('express-fileupload');
const app = express();

// default options
app.use(fileUpload());

也不要忘记在没有文件上传的情况下添加空检查:

app.post('/upload', function(req, res) {
  if (!req.files || Object.keys(req.files).length === 0) {
    return res.status(400).send('No files were uploaded.');
  }
  let file = req.files.file;
  // do something with uploaded temp file
}

2。上传文件时内容类型应为multipart/form-data

const handleSubmit=(e)=>{
e.preventDefault()
const formData=new FormData()
formData.append('file', file)
setfile('')
}

function addPost(postdetail){
  axios.post('http://localhost:4000/blog',formData, {
    headers: {
      'Content-Type': 'multipart/form-data'
    }
  }).then(res=>{
      dispatch({
        type:'ADD_DATA',
        payload:res.data
      })
      
    }).catch(error=>{ 
      console.log(error)
    })
  }

3。其他表单字段(des、title)可能无法使用 multipart/formdata 提交

考虑为博客创建开辟两条路线。

[POST] '/blog/upload-image'图片上传

[POST] '/blog/new 用于创建博客(从图片上传响应中获取标题、des 和 image_id)

【讨论】:

  • 如果我使用两种发布方法,我可以添加标题和描述以及来自同一表单的图像吗?
  • uploadImages().then(resp =&gt; { const imagesIds = resp.data; saveBlog(title, desc, imagesIds));
  • 并且 app.use(fileUpload()) 应该放在其他任何东西之前,就在 app.use 声明之后。我在 app.use(cors()) 和 app.use(express.json()) 之后有了它,但它没有用。
猜你喜欢
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 2021-10-15
相关资源
最近更新 更多