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.

Restaurar los datos de solicitud después de analizar el multipart/form-data.

Estoy tratando de implementar un middleware que pueda leer el contenido de los datos enviados en la solicitud como “multipart/data-form” y luego restaurarlo para que “express-graphql” y “graphql-upload” puedan entender la solicitud.

Dado que necesito leer el contenido en el middleware, estoy usando “multer” antes para tener acceso a las propiedades que se están enviando. Pero cuando la solicitud continúa su curso, se lanza el siguiente error: “BadRequestError: Falta el campo multipart ‘operations'”.

// primer middleware
import multer from 'multer';
// ...

const middleware = (req: express.Request, res: express.Response, next: express.NextFunction) => {
  if (req.header('Content-Type')?.startsWith('multipart/form-data')) {
    const storage = multer.memoryStorage();
    return multer({ storage }).single('1')(req, res, next);
  }

  return next();
}

export default middleware;

El problema es que después de que se activa este middleware, “graphql-upload” ya no puede entender la solicitud.

mutation uploadDocument($doc: DocumentInput!, $file: Upload!) {
  uploadDocument(doc: $doc, file: $file)
}

¿Sabes cómo puedo restaurar los datos en la solicitud?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para restaurar los datos de una solicitud multipart/form-data después de usar multer, puedes utilizar el middleware graphql-upload proporcionado por Apollo Server. Este middleware transforma el objeto Request de una manera que graphql-upload pueda entender. A continuación se muestra un ejemplo de cómo puedes utilizarlo junto con tu middleware existente:

    import { graphqlUploadExpress } from 'graphql-upload';
    
    const middleware = [
      (req: Request, _: Response, next: NextFunction) => {
        if (req.header('Content-Type')?.startsWith('multipart/form-data')) {
          const storage = multer.memoryStorage();
          return multer({ storage }).single('1')(req, _, next);
        }
    
        return next();
      },
      graphqlUploadExpress(), // agregar este middleware después del middleware existente
    ];
    

    Una vez que agregues graphqlUploadExpress como middleware, modificará el objeto req para agregar las propiedades necesarias para que graphql-upload funcione. Ahora puedes utilizar tu punto de acceso express-graphql como de costumbre con solicitudes multipart/form-data.

    mutation uploadDocument($doc: DocumentInput!, $file: Upload!) {
      uploadDocument(doc: $doc, file: $file)
    }
    

    Ten en cuenta que, según tu configuración, es posible que necesites ajustar el orden de tus middlewares para asegurarte de que graphqlUploadExpress se ejecute después de todos los middlewares relevantes para tu aplicación.

Comments are closed.