OpenAPITools / OpenAPITools/openapi-generator

[BUG] [Javascript] Deserialization problem on model responses

Open
#4,879 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Client: JavaScript/Node.js Issue: Bug
Dominant language
Java
Stars
26.8k
Forks
7.7k
PR merge metrics
PR metrics pending

Description

Description

When a response is defined on the .yml as an object, there are a problem with the serialization of the response: the object is empty.

This happen because the response object should be parsed as JSON before enter to the constructFromObject function, used to serialize.

openapi-generator version
➜ openapi-generator version
4.2.2
OpenAPI declaration file content or url
openapi: 3.0.0
info:
    title: RetroShare OpenApi wrapper
    version: 0.0.1
    description: RetroShare OpenApi wrapper generated using Doxygen documentation
    license:
        name: AGPLv3
servers:
    - url: http://127.0.0.1:9092/

paths:
    /jsonApiServer/version:
        post:
            operationId: JsonApiServerVersion
            summary: Write version information to given paramethers  
            deprecated: false

            
            responses:
                '200':
                    description: >
                            return: 
                            [out] major(integer)storage 
                            [out] minor(integer)storage 
                            [out] mini(integer)storage 
                            [out] extra(string)storage 
                            [out] human(string)storage 
                    content:
                        application/json:
                            schema:
                                $ref: '#/components/schemas/RespJsonApiServerVersion'

components:      
    schemas:        
        RespJsonApiServerVersion:
            type: object
            properties:
                major:
                    type: integer
                minor:
                    type: integer
                mini:
                    type: integer
                extra:
                    type: string
                human:
                    type: string
Command line used for generation
➜ openapi-generator generate -i definition.yml -g javascript -o openapi-javascript-retroshare-api-wrapper
Steps to reproduce

First of all generate the wrapper using the command above. Then cd into it and npm install the modules.

You will need to have the retroshare-service working on your computer to get the backend answer. Here instructions for debian based systems. Then install retroshare-service. The response should be something like:

{
    "major": 0,
    "minor": 6,
    "mini": 9999,
    "extra": "-retroshare-service-OBS-deb",
    "human": "0.6.9999-retroshare-service-OBS-deb"
}

Then you can write a test to test it, copy the following code on test/ folder:

(function(root, factory) {
    if (typeof define === 'function' && define.amd) {
      // AMD.
      define(['expect.js', process.cwd()+'/src/index'], factory);
    } else if (typeof module === 'object' && module.exports) {
      // CommonJS-like environments that support module.exports, like Node.
      factory(require('expect.js'), require(process.cwd()+'/src/index'));
    } else {
      // Browser globals (root is window)
      factory(root.expect, root.RetroShareOpenApiWrapper);
    }
  }(this, function(expect, RetroShareOpenApiWrapper) {
    'use strict';
  
    var apiInstance;
  
    beforeEach(function() {
      apiInstance = new RetroShareOpenApiWrapper.DefaultApi();
    });
  
    var getProperty = function(object, getter, property) {
      // Use getter method if present; otherwise, get the property directly.
      if (typeof object[getter] === 'function')
        return object[getter]();
      else
        return object[property];
    }
  
    var setProperty = function(object, setter, property, value) {
      // Use setter method if present; otherwise, set the property directly.
      if (typeof object[setter] === 'function')
        object[setter](value);
      else
        object[property] = value;
    }
  
    describe('/jsonApiServer/version', function() {
      it('should show the jsonApiServer version, returns RespJsonApiServerVersion', function() {
        apiInstance.jsonApiServerVersion((error, data, response) => {
          if (error) {
            console.error(error);
          } else {
            console.log('API called successfully. Returned data: ', data);
            
          }
        });
        
      });
  
    });
  
  }));

And then execute the test, from the generated root folder:

./node_modules/mocha/bin/mocha --require @babel/register --recursive test/versiontest.spec.js 

The response is:

API called successfully. Returned data:  RespJsonApiServerVersion {}

As you will see the RespJsonApiServerVersion object is empty.

Suggest a fix

Debugging the generated code, if you go to ApiClient.convertToType on src/ApiClient.js you will see that the type is // for model type like User and enum class (L510), that call the type.constructFromObject(data) function.

Inside this funcion on src/model/RespJsonApiServerVersion.js if you debug data you will find the correct json object. The problem is that for serialize this object the data must be parsed as JSON using JSON.parse(data) to get the lines if (data.hasOwnProperty('major')) working.

So if we add the following line on the constructFromObject function it solves the problem on my case.

data = JSON.parse(data)

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in src/ApiClient.js at convertToType and inspect how it passes response data to constructFromObject in src/model/RespJsonApiServerVersion.js. Run test/versiontest.spec.js with the provided generated client and confirm that the returned model contains the response fields instead of being empty.

Written by the indexing model from the issue text.

Assessment

Tech stack
javascript
Domain
api
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.