ljharb/qs

Different array parse behaviour of x-www-form-urlencoded between ExpressJS and rails

Open

#178 opened on Nov 11, 2016

View on GitHub
 (4 comments) (2 reactions) (0 assignees)JavaScript (744 forks)batch import
bughelp wantedparse

Repository metrics

Stars
 (8,015 stars)
PR merge metrics
 (Avg merge 6d 22h) (2 merged PRs in 30d)

Description

I use content-type: application/x-www-form-urlencoded to send POST request to backend server. The post body as follow:

listing[pictures][files][][name]=9ADDD7B1-FCFF-4538-916A-1E63DFB43A72&
listing[pictures][files][][name]=EFFE67B2-5D41-4B74-A33E-5963F54FAEC7&
listing[pictures][files][][name]=BBC9CB38-FE01-4F1A-AE37-7ED71F4B2CB5

In backend server, if I use ruby on rails, the POST will be parsed as follow:

"pictures"=>{
    "files"=>[
        {"name"=>"9ADDD7B1-FCFF-4538-916A-1E63DFB43A72"}, 
        {"name"=>"EFFE67B2-5D41-4B74-A33E-5963F54FAEC7"}, 
        {"name"=>"BBC9CB38-FE01-4F1A-AE37-7ED71F4B2CB5"}
    ]
}

This result is what I expected to be.

But, If I use nodeJS express and body-parser:

// parse application/json
app.use(bodyParser.json());
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }));

extended: true means that bodyParser will use qs to parse data.

The POST will be parsed as follow:

"pictures"=>{
    "files"=>[
        "name"=>[
            "9ADDD7B1-FCFF-4538-916A-1E63DFB43A72", 
            "EFFE67B2-5D41-4B74-A33E-5963F54FAEC7", 
            "BBC9CB38-FE01-4F1A-AE37-7ED71F4B2CB5"
        ]
    ]
}

Contributor guide