javascript - express为什么不能解析ajax post 上来的数据?
大家讲道理
大家讲道理 2017-04-10 16:59:58
0
6
596

jquery.ajax post提交一个对象

打印出req.body,结果是这样的

请问这是什么原因?用form表单同步提交是可以正常解析的

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

reply all (6)
小葫芦

jQuery.ajaxsend 数据的时候默认contentTypeapplication/x-www-form-urlencoded

application/x-www-form-urlencoded标准要求如下

  1. namevalue都必须escaped,空格使用+代替

  2. 按照文档中的顺序 以names/values(键值对)形式 提交,每一组数据以&分割

link: https://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1

info[name]=hury&info[age]=40

楼主提问的数据,post.body内容如上,解析是完全正确的,键值对只有一级,且所有都是平等的,不存在子元素等。

如果希望提交的数据直接解析成对象,可以参考其他的答案,body-parserformidable等组件解析。

常用的contentType还有

  • multipart/form-data上传文件

  • text/plain原生数据没有经过处理,可以自定义解析方式

    巴扎黑

    你使用express的时候,是不是没有安装并启用body-parser这个中间件呀?

      洪涛

      post的数据是键值对的形式的。你可以把数据弄成字符串的形式传过去。

      可改写为:

      var data = { info: { name: 'john', age: 10 } }; $.ajax({ url: 'test', type: 'post', dataType: 'text', data: { data: JSON.stringify(data) } });

      后端:

      .post('/test', function(req, res) { console.log(JSON.parse(req.body.data)); });
        小葫芦

        为什么不用更好用的 Nokitjs ? http://nokit.org ;-D

          大家讲道理

          各位,我看了下bodyParser官方的解释:
          bodyParser.urlencoded的参数extended,如果为 true (默认),则使用第三方插件qs来解析内容,如果为 false 则使用node内建对象querystring来解析内容。

          区别就在这里了:
          querystring并不支持解析复杂对象(多级嵌套),比如说'data[name]=henry&data[age]=10'是不被支持的,它支持name=henry&age=10的这种query格式。
          qs则是在querystring的基础进行了封装,实现了对复杂对象的解析,如qs.parse('data[name]=henry&data[age]=10')可以得出{ data: { name: 'henry', age: 10 } }

          至于为什么form表单直接提交和ajax提交结果不一样,原因是:
          form提交一个多选项,传输的格式是这样的hobby=sport&hobby=coding而使用jquery.ajax post提交{hobby: ['sport', 'coding']},传输的格式是这样的hobby[0]=sport&hobby[1]=coding,所以就造成了解析的错误。至于为什么jquery没有把对象转换成我们想要的query形式,暂时还不太清楚原因。

          qs在使用时有很多限制,比如嵌套的层数、list的长度等等,express生成器默认给该中间件配置extended: false,也许就是出于性能考虑。

          最后,解决办法:
          方法一:将jquery.ajax的contentType参数设置为'application/json',并对传输的数据进行转换
          方法二:配置中间件borderParser.urlencoded({ extended:true})

          最最后,感觉各位大神的帮忙,感谢nealnote

            左手右手慢动作

            data格式有问题

              Latest Downloads
              More>
              Web Effects
              Website Source Code
              Website Materials
              Front End Template
              About us Disclaimer Sitemap
              php.cn:Public welfare online PHP training,Help PHP learners grow quickly!