1. 程式人生 > >nodejs如何正確接收陣列和物件

nodejs如何正確接收陣列和物件

文章目錄

需求

今天接收頁面Form表單POST請求送來的多層物件,得到的資料如下:

user[name]=zhao&user[pass]=111

因為Form表單預設的content-type是 x-www-form-urlencoded

解決過程

那麼nodejs怎麼將上面的資料正確轉成我們想要的資料?

  1. 因為我用的是express框架,所以我預設就使用了body-parser這個中介軟體,得到的res.body:

    console.log(res.body)
    // {'user[name]: 'zhao', 'user[pass]: 111}

    很明顯,body-parser只能解析單層物件

  2. 這時我想到了express自帶的querystring中介軟體,好像就是專門解決這類資料的,結果

     console.log(res.body) // {'user[name]: 'zhao', 'user[pass]: 111}
    

    與第一種得到的結果一模一樣

  3. 這時我想是不是express自帶是簡化版,所以就去npm搜一下,找到了一個熱門的query-string,看了文件發現功能確實比express自帶的多,但只能正確解析陣列,不能解析多層物件,比如

    const queryString = require('query-string')
    queryString.parse('foo[0]=1&foo[1]=2&foo[3]=3', {arrayFormat: 'index'});
    //=> foo: [1,2,3] 
    
  4. 說實話這時候是有點氣餒,只好google了。
    google了半天,得到的結論就是將content-type改為application/json,但這不是我想要的。

  5. 正當我快放棄時,我突然在npm看到qs這個npm包,開啟文件,果然,你想要的都在:

    const qs = require('qs'
    ) // 兩層物件 qs.parse('user[name]=zhao&user[pass]=111') => {user: {name: 'zhao', pass: 111}} // 多層 qs.parse('user[name][xin]=111&user[pass][word]=222') => {user: {name: {xin: zhao}, pass: {word: 222}}} // 陣列物件 qs.parse('user[0]=1&user[1]=2') => {user: [1, 2]}

    不管多少層巢狀,都能正確解析

最後確實得說一下npm包這個問題,相同或相似型別的npm包實在是太多,而且有時候熱門的還有好幾個,確實有點難區分,可能有更好的,但怎麼才能找到最好的,這確實是個問題?