Estoy usando el paquete Multer Node JS para cargar archivos en mi servidor de aplicaciones, el código es básicamente un código de archivo de carga típico
const express = require('express') const multer = require('multer') const upload = multer({ dest: 'uploads/' }) const app = express() app.post('/profile', upload.single('avatar'), function (req, res, next) { // req.file is the `avatar` file // req.body will hold the text fields, if there were any }) app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) { // req.files is array of `photos` files // req.body will contain the text fields, if there were any })Pero cada vez que se carga un archivo, el servidor Node deja de responder y la interfaz de otra solicitud no recibe ninguna respuesta de otras API hasta que se carga el archivo.
¿Cuál es la mejor manera de abordar esto?
En su código de muestra, solo debe enviar una respuesta al cliente mediante res.json() o res.end() :
const express = require('express'); const multer = require('multer'); const upload = multer({ dest: 'uploads/' }); const app = express(); app.post('/profile', upload.single('avatar'), function (req, res, next) { // req.file is the `avatar` file // req.body will hold the text fields, if there were any res.status(204).end(); }); app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) { // req.files is array of `photos` files // req.body will contain the text fields, if there were any res.status(204).end(); });Puedo darte un ejemplo de cómo implementé una carga de imágenes en mi aplicación. es el código para cargar una imagen de perfil para un usuario. También estoy usando el middleware multer para que sea similar para ti:
código es el siguiente:
// multer middleware: const multer = require('multer'); const MIME_TYPE_MAP = { 'image/png': 'png', 'image/jpeg': 'jpg', 'image/jpg': 'jpg', }; module.exports = storage = multer.diskStorage({ destination: (req, file, cb) => { const isValid = MIME_TYPE_MAP[file.mimetype]; let error = new Error('invalid mime type'); if (isValid) { error = null; } cb(error, 'images'); }, filename: (req, file, cb) => { const name = file.originalname.toLowerCase().split(' ').join('-'); const ext = MIME_TYPE_MAP[file.mimetype]; if (name.includes('.' + ext)) { cb(null, name) } else { cb(null, name + '.' + ext); } }, });y aquí el código en el servicio que maneja la carga de archivos
// profile service in backend written in express exports.uploadImage = (req, res, next) => { const url = req.protocol + '://' + req.get('host'); profileRepository .findOne({ _id: req.params.id }) .then((response) => { const fetchedUser = response; fetchedUser.imagePath = url + '/images/' + req.file.filename; profileRepository .updateOne({ _id: req.params.id }, fetchedUser) .then((response) => { return res.status(200).json({ message: 'profileimage updated', }); }) .catch((error) => { return res.status(500).json({ message: 'uploading image failed', }); }); }) .catch((error) => { return res.status(404).json({ message: 'fetching user failed', }); }); };luego uso el middleware en mi archivo de rutas de perfil como este:
// profile.routes.js const express = require('express'); const ProfileController = require('./profileController'); const checkAuth = require('../middleware/checkAuth'); const router = express.Router(); const fileStorage = require('../middleware/fileStorage'); const multer = require('multer'); // imageUpload router.post('/user/image/:id', checkAuth, multer({storage: fileStorage}).single('image'), ProfileController.image);mi controlador luego llama a la función de servicio con la lógica comercial real como esta:
// profile.controller.js const profileService = require('./profileService'); exports.image = (req, res, next) => { return profileService.uploadImage(req, res); };y finalmente mi ruta es utilizada por mi archivo app.js de esta manera:
// app.js const express = require('express'); const profileRoutes = require('./profile/profileRoutes'); const app = express(); // set images path for saving images on server app.use('/images', express.static(path.join('images'))); app.use('/api', profileRoutes); module.exports = app;espero haber podido orientarte en la dirección correcta con mi ejemplo