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 ...
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
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.
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.