jsonerlangchicagoboss

Erlang Chicagoboss unable to get the correct JSON response


In my controller file I have a method that reads the incoming HTTP request, reads the user data from the Database, encodes the result in JSON (using jsx) and sends it in response.

    sensorusersdetails('GET', []) ->
        Headers = [{'Access-Control-Allow-Origin', "*"},
        {'Access-Control-Allow-Methods',  "GET, OPTIONS"},
        {'Content-Type',  "application/json"},
        {'Access-Control-Allow-Headers', "X-Requested-With"},
        {'Access-Control-Max-Age', "180"}],   
        Building =  Req:query_param("bld"),
        io:format("User Data request from Node.js server~n~p~n", 
        [Req:query_params()]),
        {{Year,Month,Day},{_,_,_}} = erlang:localtime(),
        StrDate = lists:flatten(io_lib:format("~4..0w-~2..0w-~2..0w",
        [Year,Month,Day])),
        BUserDataList = boss_db:find(sensoruser_data, [{building, 'equals', Building}]),
        io:format("Current Users Data stored in the database: ~n~p~n",[BUserDataList]),

        MyUserJSONList = sensor_preapre_data(BUserDataList, StrDate),
        io:format("The Present Date Sensor Users Data with Binary 1: ~n~p~n",[MyUserJSONList]),
        MyUserJSONListLength = length(MyUserJSONList),
        if MyUserJSONListLength > 0 ->     
            MyFinalList = sensor_data_final(MyUserJSONList),
            io:format("The Present Date Sensor Users Data without Binary 2: ~n~p~n",[MyFinalList]),
            {200, [MyFinalList], Headers};
            %%{json, MyFinalList};
        true ->
            {200, "NO DATA FOUND", Headers}
            %%{json, [{error, "NO DATA FOUND"}]}
        end.        

In the Chicagoboss Server logs I'm getting:

The Present Date Sensor Users Data with Binary 1: 
[[<<"{\"username\":\"KPBatman1\",\"building\":\"A\",\"device\":\"Fitbit\",\"date\":\"2017-07-23\",\"calorie\":732,\"distance\":6.4399999999999995,\"elevation\":0,\"floor\":0,\"steps\":8}">>],
 [<<"{\"username\":\"KPSuperman1\",\"building\":\"A\",\"device\":\"Jawbone\",\"date\":\"2017-07-23\",\"calorie\":0,\"distance\":0.0,\"elevation\":0,\"floor\":0,\"steps\":0}">>]]

The Present Date Sensor Users Data without Binary 2: 
[["{\"username\":\"KPBatman1\",\"building\":\"A\",\"device\":\"Fitbit\",\"date\":\"2017-07-23\",\"calorie\":732,\"distance\":6.4399999999999995,\"elevation\":0,\"floor\":0,\"steps\":8}"],
 ["{\"username\":\"KPSuperman1\",\"building\":\"A\",\"device\":\"Jawbone\",\"date\":\"2017-07-23\",\"calorie\":0,\"distance\":0.0,\"elevation\":0,\"floor\":0,\"steps\":0}"]]

However, when I send the HTTP request - the JSON response I am getting:

{"username":"KPBatman1","building":"A","device":"Fitbit","date":"2017-07-23","calorie":732,"distance":6.4399999999999995,"elevation":0,"floor":0,"steps":8}
{"username":"KPSuperman1","building":"A","device":"Jawbone","date":"2017-07-23","calorie":0,"distance":0.0,"elevation":0,"floor":0,"steps":0}

What is the correct way to send JSON response?


Solution

  • However, when I send the HTTP request - the JSON response I am getting:

    {"username":"KPBatman1","building":"A", ...}
    {"username":"KPSuperman1","building":"A", ...}
    

    And? What did you expect/want to get?

    The following code works for me because the output is what I expected to see:

    -module(cb_tutorial_greeting_controller, [Req]).
    -compile(export_all).
    
    hello('GET', []) ->
        Headers = [
            {'Access-Control-Allow-Origin', "*"},
            {'Access-Control-Allow-Methods',  "GET, OPTIONS"},
            {'Content-Type',  "application/json"},
            {'Access-Control-Allow-Headers', "X-Requested-With"},
            {'Access-Control-Max-Age', "180"}
        ],   
        Data = [
            [<<"{\"username\":\"KPBatman1\",\"building\":\"A\"}">>],
            [<<"{\"username\":\"KPSuperman1\",\"building\":\"A\"}">>]
        ],
        Json = jsx:encode(Data),
        {200, Json, Headers}.
    

    In my browser, I see:

    [["{\"username\":\"KPBatman1\",\"building\":\"A\"}"],["{\"username\":\"KPSuperman1\",\"building\":\"A\"}"]]
    

    Note that MyFinalList isn't even valid JSON:

    13> Data = [["{\"a\":\"Batman\"}"], ["{\"b\":\"Superman\"}"]].
    [["{\"a\":\"Batman\"}"],["{\"b\":\"Superman\"}"]]
    
    14> jsx:is_json(Data).
    false
    

    See what I did there?