Cuando estamos tratando de subir archivos en NodeJS, dependiendo de la libreria que usemos podemos tener más o menos problemas a la hora de subir cualquier fichero, imagen o lo que sea.
Uno de los errores más comunes que puedes tener con librerias como multiparty, connect-multiparty, express-fileupload, formidable, incluso multer, es que nos aparezcan errores relacionados con la propiedad path como este:
TypeError: Cannot read property 'path' of undefined
El problema es que con ciertas versiones de express, la subida de archivos (multipart/form-data) no se está procesando correctamente y algunas librerias han dejado de funcionar en algunos casos aislados.
Para arreglar esto, vamos a usar una librería para subir archivos en NodeJS que se llama Multer.
Lo primero que debemos hacer es instalar multer:
npm install --save multer
Luego en el archivo en el que estemos configurando nuestras rutas haremos los siguientes pasos.
PASO 1. Cargar el modulo de la subida de ficheros:
const multer = require('multer');
PASO 2. Configurar donde se van a subir los ficheros en el servidor y cual va a ser el nombre de esos archivos:
const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, './uploads/users/') }, filename: function (req, file, cb) { cb(null, "user" + Date.now() + file.originalname); } });
PASO 3. Crear el objeto de multer y pasarle la configuración:
const upload = multer({ storage: storage });
PASO 5. En el endpoint de subida de archivos usar el middleware upload.single(«name del campo a subir») para subir el fichero finalmente:
router.post('/upload-avatar', [md_auth.authenticated, upload.single('file0')], UserController.uploadAvatar);
El código final relacionado con esto, se quedaria así:
const multer = require('multer'); const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, './uploads/users/') }, filename: function (req, file, cb) { cb(null, "user" + Date.now() + file.originalname); } }); const upload = multer({ storage: storage }); router.post('/upload-avatar', [md_auth.authenticated, upload.single('file0')], UserController.uploadAvatar);
También es muy importante resaltar que el objeto del archivo subido está adjunto en el request de la petición, teniendo que acceder a el de esta manera: req.file o req.file.path para acceder en concreto a la propiedad path que necesitamos.
Obviamente en tu fichero de rutas debes tener mas cosas, como la carga de controladores, otros middlewares, etc, pero con estos pasos ya hemos solucionado el este problema «Cannot read property ‘path’ of undefined» y ya funcionaria la subida de imágenes, o cualquier otro tipo de archivo en node.
Nos vemos en el resto de mis cursos de desarrollo, en este blog y en mi canal de YouTube 😉