es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Fastify lanza un error de promesa no cumplida en la carga de archivos.

Estoy aprendiendo Fastify, así que he escrito un programa sencillo para cargar archivos usando Fastify-Formidable. El archivo se carga correctamente y se mueve a su directorio de destino con la ayuda del paquete mv. Sin embargo, mientras esto sucede, Fastify muestra un error de Promesa No Manejada en la consola. Mi código es el siguiente:

const insertManyWorkers = async (request, reply) => {      
  try {
    await request.parseMultipart();    
    let oldpath = await request.files.picture.path;
    let uploadDir = '/home/hamza/Documents/Web-Projects/Personal/test/img/' + request.files.picture.name;   
    await mv(oldpath, uploadDir, {
      mkdirp: true
    }, function(err) {    
      if (err) {
        reply.send(err);    
      } else {
        reply.code(200).send('uploaded')    
      }
    });   
  } catch (error) {
    console.log(error);
    reply.send(error)    
  };
};

El error es el siguiente:

01:17:24 ✨ incoming request POST xxx /workers/insert 01:17:24 💀 Promise puede no ser cumplida con 'undefined' cuando el statusCode no es 204 FastifyError: Promise puede no ser cumplida con 'undefined' cuando el statusCode no es 204 en /home/user-1/Documents/Web-Projects/test/node_modules/fastify/lib/wrapThenable.js:30:30 en processTicksAndRejections (node:internal/process/task_queues:96:5) { "err": { "type": "FastifyError", "message": "Promise puede no ser cumplida con 'undefined' cuando el statusCode no es 204", "stack": "FastifyError: Promise puede no ser cumplida con 'undefined' cuando el statusCode no es 204\n at /home/hamza/Documents/Web-Projects/Personal/test/node_modules/fastify/lib/wrapThenable.js:30:30\n at processTicksAndRejections (node:internal/process/task_queues:96:5)", "name": "FastifyError", "code": "FST_ERR_PROMISE_NOT_FULFILLED", "statusCode": 500 } } 01:17:24 ✨ solicitud completada 18ms [fastify-cli] proceso finalizado forzadamente 01:17:30 ✨ Servidor escuchando en http://0.0.0.0:5000

Además, Fastify también registra [fastify-cli] proceso finalizado forzadamente después de unos pocos milisegundos de la carga del archivo.

Parece que el back-end no sabe cuándo termina la solicitud y por lo tanto finaliza el proceso de carga de forma abrupta. No estoy seguro de qué hacer a partir de aquí, así que agradecería cualquier ayuda.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para el error de Promesa no gestionada con Fastify-Formidable

    El error que ocurre en el código al utilizar Fastify-Formidable se debe a un error de Fastify que intenta finalizar una solicitud antes de que haya sido completamente gestionada. El mensaje de error dice “La promesa no puede cumplirse con ‘indefinido’ cuando el código de estado no es 204”. Además, Fastify registra “proceso finalizado forzadamente” después de unos pocos milisegundos de la carga del archivo.

    Para resolver este error, puedes intentar los siguientes pasos:

    1. Mueve la declaración reply fuera de la función mv() porque la función mv() utiliza una función de retorno de llamada y no devuelve una promesa, lo cual puede generar confusión en la sintaxis async/await.

      Este cambio solucionará el error donde se llamaba a reply.send() dentro de la función de retorno de llamada pero fuera del bucle de eventos, lo que provocaba que la solicitud finalizara prematuramente.

      await mv(oldpath, uploadDir, {
         mkdirp: true
      }, function(err) {    
         if (err) {
             console.log(err);
         } else {
             console.log(`archivo cargado con éxito: ${request.files.picture.name}`);
         }
      });
      reply.code(200).send('cargado');
      
    2. Reemplaza reply.send(err) con console.log(err) dentro de la función mv() como una alternativa para enviar una respuesta de error.

      El método reply.send() se utiliza para enviar una respuesta al cliente, pero no queremos enviar una respuesta de error si ocurre un error al mover el archivo. Por lo tanto, utilizaremos console.log() para registrar el error en su lugar.

      await mv(oldpath, uploadDir, {
         mkdirp: true
      }, function(err) {    
         if (err) {
             console.log(err);
         } else {
             console.log(`archivo cargado con éxito: ${request.files.picture.name}`);
         }
      });
      
    3. Finalmente, modifica la función insertManyWorkers eliminando el bloque catch para evitar capturar el error lanzado por el paquete Fastify. Este cambio es necesario porque no queremos capturar el error interno de Fastify, sino manejar el error en la función de retorno de llamada mv().
      const insertManyWorkers = async (request, reply) => {      
        await request.parseMultipart();    
        let oldpath = await request.files.picture.path;
        let uploadDir = '/home/hamza/Documents/Web-Projects/Personal/test/img/' + request.files.picture.name;   
        await mv(oldpath, uploadDir, {
            mkdirp: true
        }, function(err) {    
            if (err) {
               console.log(err);
            } else {
               console.log(`archivo cargado con éxito: ${request.files.picture.name}`);
            }
        });   
      };
      

    Con estos cambios, el error debería estar resuelto y la carga del archivo debería proceder sin problemas.

Comments are closed.