Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

572
Views
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 ejecuta 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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!