'Req.file undefined Multer

how are you doing? Well im having troubles with req.files, it comes undefined when i already pass the middleware of upload.single and i cant find the error!

Front

import React, { Component }from 'react';
import "./register.css"
import Axios from "axios";

class Register extends Component {
state = {
    nombre: "",
    apellido: "",
    password: "",
    file: ""
}

changeHandler = e => {
    if (e.target.name === "file") {
        this.setState({ [e.target.name]: e.target.files });
    } else {
        this.setState({ [e.target.name]: e.target.value });
    }
}

submitHandler = e => {
    e.preventDefault();
    
    const formData = new FormData();
    formData.append("nombre", this.state.nombre);
    formData.append("apellido", this.state.apellido);
    formData.append("password", this.state.password);
    formData.append("file", this.state.file);


    Axios
    .post('http://localhost:5000/usuarios/guardar', formData)
    .then(response => {
        console.log(response)
        })
    .then(data => console.log(data))
        .catch(error => {
            console.log(error)
        })

        console.log("file", this.state.file)

}
    
    render(){
        
        const {nombre,apellido,password} = this.state
        
        return(
            <section className="forms-container margin-sections">
            <form onSubmit={this.submitHandler} method="POST" id="register" encType="multipart/form-data">
                    <fieldset>
                        <input type="text" placeholder="Nombre" name="nombre" value={nombre} className="input" onChange={this.changeHandler}/>
                    </fieldset>
                    <fieldset>
                        <input type="text" placeholder="Apellido" name="apellido" value={apellido} className="input" onChange={this.changeHandler}  />
                    </fieldset>
                    <fieldset>
                        <input type="password" placeholder="Contraseña" name="password" value={password} className="input" onChange={this.changeHandler} />
                    </fieldset>
                    <fieldset>
                        <input type="file" name="file" className="input" onChange={this.changeHandler} id="user-photo" />
                    </fieldset>
                <fieldset>
                    <button className="button-login" type="submit">Enviar</button>
                </fieldset>
                </form>
        </section>
)}
}

export default Register;

Route

const express = require('express');
const router = express.Router();
const path = require("path");
const fs = require("fs");
const user = require("../controllers/user");
const multer = require("multer");



// ************ Multer ************

const dest = multer.diskStorage({
destination: function (req, file, cb) {
    let dir = path.resolve(__dirname,"../../public/uploads","users", 
String(req.body.nombre).trim().replace(/\s+/g, ''))
    if (!fs.existsSync(dir)){
        fs.mkdirSync(dir);
    }
    cb(null, dir)
},
filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now()+ path.extname(file.originalname))
}
})

const upload = multer({storage:dest});


// ************ Rutas ************

router.post('/guardar',[upload.single("file")], user.post)

module.exports = router;

Controller

      const db = require("../database/models");

const main = {
post: async (req, res) => {
    try{
        
        let data = req.body;
        
        let file = req.file


        // console.log("holaa2", req);

        console.log("holaa2", file);

        
        let usuario = {
            nombre: String(data.nombre),
            apellido: String(data.apellido),
            password: String(data.password),
            // image: file.file
        }

        // let usuarios = await db.Users.create(usuario)

        return console.log("llegue bien perreke");
        
    }catch(e){
        console.log(e);
    }
},
}


module.exports = main;

Entry Point

 // ************ Require's ************

 const express = require('express');
 const path = require('path');
 const app = express();
 const cors = require('cors');
 const bodyParser = require('body-parser');


 // ************ Data Configuration ************

 app.use(bodyParser.json())
 app.use(express.urlencoded({ extended: true}));
 app.use(express.json())

 //CORS
 app.use(cors());

// ************ Servidor ************

app.set("port", process.env.PORT || 5000);
app.listen(app.get("port"), () => console.log("Server start in 
http://localhost:"+app.get("port")));



// ************ Acceso Publico ************

app.use(express.static(path.resolve(__dirname, "../public/uploads/instruments"))); // 
Necesario para los archivos estáticos en el folder /public

// ************ API's ************

const apiInstrumentos = require("./routes/apiInstrumentos");

app.use("/instrumentos", apiInstrumentos)


// ************ Router Define ************

const instrumentRouter = require("./routes/instrumentos.js");

app.use("/", instrumentRouter);

const users = require("./routes/user");

app.use("/usuarios", users);

EDIT

I found that when i use upload.any() appear files option inside req, while using upload.single("file") nothing appear instead.

So what can i do? Thanks!!!



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source