Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

1.1K
Visualizações
error de API abierta: la solicitud debería tener la propiedad requerida '.headers' - ventana acoplable

Mi aplicación nodejs tiene un archivo open-api.yaml y un validador express-openapi-validate . Estoy haciendo una solicitud POST que funciona y el validador de API no devuelve ningún error:

 curl --request POST 'http://localhost:33004/my-app/settings' --data-raw '{"serials":["1234","2355"]}' -H 'Content-Type: application/json'

En mi open-api.yaml tengo:

 openapi: '3.0.0' servers: - url: 'http://{host}/my-app' variables: host: enum: - 'localhost' .... ... paths: /settings: ... post: tags: - 'settings' operationId: 'postSettings' requestBody: content: application/json: schema: type: object properties: serials: type: array items: type: string ...

Luego intenté acoplar mi aplicación: creé un contenedor acoplable y lo ejecuté dentro con el tiempo de ejecución pm2. Sin embargo, cuando envío la misma solicitud al contenedor docker cuando la aplicación se está ejecutando en él, aparece un error while validating request: request should have required property '.headers' . No tengo la propiedad '.headers' mencionada en el archivo open-api.yaml.

Intenté eliminar el middleware del validador y la solicitud se realizó correctamente. ¿Me pueden ayudar a entender de qué se queja el validador?

EDITAR:

Logré encontrar el objeto de error:

 { "data": [ { "dataPath": "", "keyword": "required", "message": "should have required property '.headers'", "params": { "missingProperty": ".headers" }, "schemaPath": "#/required" } ], "name": "ValidationError", "statusCode": 400 }

no hace falta decir que no tengo propiedades de encabezados requeridas ...

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Tuve lo mismo para todas las versiones de nodos <= 14 y para la versión express-openapi-validator <= 3.

Imposible tener el validador funcionando con la versión 16 del nodo y por eso nos quedamos atascados en una versión de desarrollo anterior.

La solución fue migrar a express-openapi-validator v4.

La migración se explica aquí https://github.com/cdimascio/express-openapi-validator#upgrading-from-3x

Esto (v3):

 const validator = new OpenApiValidator({ apiSpec: openApiYaml, operationHandlers: __dirname }) app.use(validator)

se convierte en (v4):

 const validator = OpenApiValidator.middleware({ apiSpec: 'src/openapi.yaml' }) app.use(validator)

El código fue generado originalmente por https://hub.docker.com/r/openapitools/openapi-generator-cli

over 4 years ago · Santiago Trujillo Relatório

0

Para referencia futura si otros vienen aquí por este problema:

Finalmente encontré el problema: estaba usando FROM node:alpine en mi Dockerfile, que indica la última versión de node. Sin embargo, mi aplicación se estaba ejecutando en el nodo 10.18.1

Una vez que cambié a FROM:node:10.18.1-alpine el problema se resolvió.

Aparentemente, el complemento express-openapi-validate tiene algunos problemas en el último módulo de nodo, o eso parece.

over 4 years ago · Santiago Trujillo Relatório

0

Puede que sea un poco tarde, pero espero que sea útil para otros.

El problema está relacionado con este código (esta es la versión compilada)

 ... const reqToValidate = Object.assign({}, req, { cookies: req.cookies ? Object.assign({}, req.cookies, req.signedCookies) : undefined }); const valid = validator(reqToValidate); ...

en OpenApiValidator y el hecho de que Express req object use accessor get/set para los encabezados, como resultado, Object.assign no propagará la información de los encabezados y, en consecuencia, la función de validator no encontrará las propiedades de encabezados requeridas, solo rawHeaders está disponible.

Como una solución rápida, implementé lo siguiente:

 const validator = this.openApiValidator.validate(method, path); return (req, res, next) => { const reqToValidate = Object.assign({}, req, { cookies: req.cookies ? Object.assign({}, req.cookies, req.signedCookies) : undefined }); if (!reqToValidate.hasOwnProperty('headers')) { reqToValidate.headers = req.headers; } return validator(reqToValidate, res, next); };

que adapta la solicitud Express y propaga toda la información requerida con respecto a los encabezados.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda