En mi cliente, durante el registro, estoy enviando una solicitud POST "multipart/form-data" a través de Axios que incluye un archivo Avatar de una sola imagen y campos de texto separados para el correo electrónico y la contraseña. Los datos del formulario se parecen a lo siguiente...
------WebKitFormBoundaryI99ssr3PqTpYzGeF Content-Disposition: form-data; name="file"; filename="testFile.jpg" Content-Type: image/jpeg ------WebKitFormBoundaryI99ssr3PqTpYzGeF Content-Disposition: form-data; name="email" blahblahblah@gmail.com ------WebKitFormBoundaryI99ssr3PqTpYzGeF Content-Disposition: form-data; name="password" abcdefg ------WebKitFormBoundaryI99ssr3PqTpYzGeF--En mi servidor, en la función de configuración de Multer diskStorage, me gustaría validar algunos datos en los campos de correo electrónico y contraseña y verificar mi base de datos para asegurarme de que el usuario relevante no existe antes de cargar el archivo en mi carpeta de cargas. De lo contrario, se cargarían un montón de imágenes basura que no corresponden a nada (solicitudes de registro de usuario fallidas o errores del servidor).
Me encuentro con el siguiente problema y no estoy seguro de cómo resolverlo...
1. El objeto req.body no se completa lo suficientemente pronto, por lo que no tengo acceso al campo de correo electrónico y contraseña para probar la validación o buscar o crear un usuario en mi base de datos... esto se indica claramente en la propia documentación, "Nota es posible que req.body aún no se haya rellenado por completo. Depende del orden en que el cliente transmite los campos y archivos al servidor"
2. Parece un poco extraño tener que pegar toda la lógica de mi función de middleware de enrutamiento dentro de la función de almacenamiento de disco múltiple. Antes de esto, las tenía ordenadas y ordenadas como funciones separadas siguiendo el flujo de trabajo típico (req, res, next) => {//do something... next()) . ¿Hay una mejor manera de estructurar esto o solo tengo que meterlo todo en la función Multer para asegurarme de que la carga solo se realice si es necesario?
const storage = multer.diskStorage({ destination: async (req, file, cb) => { var {email, password} = req.body; //validate incoming email and password fields var result = authSchema.validate({email: email, password: password}); if(result.error) { cb(new Error('Validation Error in multer function!')); return; } //Find or create user (image should only save to folder if a new user is created) try { var avatarSrc = `http://localhost:3001/public/avatarUploads/${file.filename}`; var [user, created] = await User.findOrCreate({ where: { email: email }, defaults: { password: password, avatarSrc: avatarSrc } }); //Upload image to folder if new user is created if(created) { cb(null, './public/avatarUploads'); } else { cb(new Error('User already exists')); return; } } catch(error) { cb(new Error('Server error')); return; } } })