React - Axios 正在将未定义的文件数据发送到节点服务器

Posted

技术标签:

【中文标题】React - Axios 正在将未定义的文件数据发送到节点服务器【英文标题】:React - Axios is sending file data as undefined to a Node server 【发布时间】:2019-11-01 12:13:36 【问题描述】:

我正在尝试上传单个文件,并将其存储在我的应用目录中的文件夹中。在前端,我成功地选择了一个文件并将其添加到 Uploader 组件的状态中。当我使用 Axios 向 Node 路由发出 POST 请求时,我在 request body 中变得未定义。

这是组件:

import React,  Component  from 'react';

import axios from 'axios';

export default class SandboxGet extends Component 
  constructor(props) 
    super(props);
    this.state = 
      file: null
    ;
  

  fileSelectHandler = event => 
    const file = event.target.files[0];
    this.setState( file: file.name );
  ;

  fileUploadHandler = () => 
    const data = new FormData();
    data.append('file', this.state.file);
    console.log(data);
    axios
      .post('http://localhost:4000/upload/', this.state.file, 
        // receive two    parameter endpoint url ,form data
      )
      .then(res => 
        // then print response status
        console.log(res.statusText);
      );
  ;

  render() 
    return (
      <div className="uploaderContainer">
        <div className="uploadInput">
          <i className="fas fa-upload" />
          <button className="uploadBtn">Select Files</button>
          <input type="file" name="file" onChange=this.fileSelectHandler />
          <div className="fileName">this.state.fileName</div>
        </div>
        <button className="uploadFile" onClick=this.fileUploadHandler>
          Upload!
        </button>
      </div>
    );
  

这里是节点服务器:

const express = require('express');
const app = express();
const multer = require('multer');
const cors = require('cors');

app.use(cors());

const storage = multer.diskStorage(
  destination: (req, file, cb) => 
    cb(null, '/storage');
  ,
  filename: (req, file, cb) => 
    cb(null, Date.now() + '-' + file.originalname);
  
);

const upload = multer( storage: storage ).single('file');

app.post('/upload', (req, res) => 
  console.log(req.file); // => returns nothing
  console.log(req.body; // => returns nothing
  upload(req, res, function(err) 
    if (err instanceof multer.MulterError) 
      return res.status(500).json(err);
     else if (err) 
      return res.status(500).json(err);
    
    return res.status(200).send(req.file);
  );
);

app.listen(4000, function() 
  console.log('App running on port 3000');
);

我觉得我已经接近了,但我错过了一大块拼图。

【问题讨论】:

提示:在使用 axios 并向您的后端发送请求之前,请先查看您的后端是否确实有效。您可以使用 Postman 发送测试请求并确保您的后端正常工作。然后,您可以继续使用 axios。 我认为你应该传递整个文件对象,而不仅仅是文件名。看看***.com/questions/41878838/… 【参考方案1】:

您正在发送this.state.file。您需要发送FormData

在你的情况下是.post('http://localhost:4000/upload/', data) 另外,您需要发送multipart/form-data 标头。

const headers = 
    'content-type': 'multipart/form-data'

那么,

axios.post('http://localhost:4000/upload/', data, headers);

【讨论】:

以上是关于React - Axios 正在将未定义的文件数据发送到节点服务器的主要内容,如果未能解决你的问题,请参考以下文章

React-Axios => 无法读取未定义的属性(读取“长度”)

Axios get request 在 React 中第一次返回 undefined

React axios 多文件上传

将未定义更改为空字符串

如何使用自定义 React 钩子通过 Axios 发出 POST 或 DELETE 请求

如何使用 react 访问 axios