Anteriormente, pude cargar una imagen desde mi aplicación de reacción usando multi-part form en el servidor de nodos usando multer y luego creé una public_url usando cloudinary . Pero ahora, como quería que las cosas fueran en tiempo real, utilicé la biblioteca socket.io , que funciona bien para mensajes de texto simples, pero ahora también quiero incluir mensajes de imagen. Entonces, para eso, estaba tratando de enviar los datos de la imagen desde la aplicación de reacción (usando el selector de imágenes) y los envié al servidor de socket usando socket.emit , recibí:
imageData: { uri: 'file:///storage/emulated/0/Android/data/com.securechat/files/Pictures/68bb637d-a19b-42e6-b083-e697fb429bf4.jpg', type: 'image/jpeg', name: 'Thu Jan 06 2022 19:19:27 GMT+0530_displayImage' } Ahora, antes, cuando estaba usando una API de fetch simple, era como:
const upload = require('../utility/multer'); router.post('/register', upload.single('photoURL'), async (req, res, next) => { const imageResult = await cloudinary.uploader.upload(req.file.path); }) Entonces, ahora estaba obteniendo la URL pública de la imagen enviada, imageResult.public_url , luego guardé esta información en mongodb, fácil.
Pero ahora, como estoy enviando a través del socket, no puedo enviarlo como multi-part form data desde mi aplicación de reacción porque ahora solo estoy emitiendo estos datos como:
Cliente: socket.emit('listener', {imageData: image});
Y este es mi lado del servidor de socket para recibir este imageData :
socket.on('listener', async data => { const result = upload.single(data.imageData); // ????? // now obviously this won't work because multer to be as a middleware & parsing multipart form data... const imageResult = await cloudinary.uploader.upload(req.file.path); // ????? io.to(id).emit('new_message', data); const message = new Message({ id: generateRandomId(), image: data.imageResult.public_url, // NEED TO CONVERT IT TO STRING OF CLOUDINARY SOMEHOW }); await message.save(); }); Entonces, como puede ver mi problema, ¿hay alguna forma de lograr esto usando multer? Solo necesito una forma de obtener la ruta del archivo y subirlo a cloudinary y finalmente obtener el .public_url para poder guardar el mensaje en mi base de datos
En breve:
Envié datos de imagen del cliente (react-native) como: socket.emit('listener', {imageData: image});
Recibí los siguientes datos en mi servidor de socket:
imageData: { uri: 'file:///storage/emulated/0/Android/data/com.securechat/files/Pictures/68bb637d-a19b-42e6-b083-e697fb429bf4.jpg', type: 'image/jpeg', name: 'Thu Jan 06 2022 19:19:27 GMT+0530_displayImage' } Solo necesito una forma de obtener un req.file.path como multer genera cuando se envía como multi-part formData (pero ahora estoy emitiendo usando socket.io), y luego guardarlo en cloudinary para obtener un public_url .