ljharb/qs

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

Open

#178 aperta il 11 nov 2016

Vedi su GitHub
 (4 commenti) (2 reazioni) (0 assegnatari)JavaScript (744 fork)batch import
bughelp wantedparse

Metriche repository

Star
 (8015 star)
Metriche merge PR
 (Merge medio 6g 22h) (2 PR mergiate in 30 g)

Descrizione

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"
        ]
    ]
}

Guida contributor