ljharb/qs

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

Open

#178 aberto em 11 de nov. de 2016

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

Métricas do repositório

Stars
 (8.015 stars)
Métricas de merge de PR
 (Mesclagem média 6d 22h) (2 fundiu PRs em 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"
        ]
    ]
}

Guia do colaborador