nodejs 搭建服务器,接收不到POST的参数
发布于 7 年前 作者 cathy1007 9975 次浏览 来自 问答

用nodejs——express模板搭建了1个demo.(配置了跨域) app.js 中配置如下: app.use(bodyParser.json({type:‘application/*+json’})); app.use(bodyParser.text()); app.use(bodyParser.urlencoded({ extended: false })); routers/index.js中的路由如下: router.post(’/post’,function(req,res,next){ console.log(“body==”+JSON.stringify(req.body)); console.log(“name=”+req.body.name); console.log(‘gender=’+req.body.gender); res.send(‘ok’); } 在另外一个文件夹中新建了一个html,引用的jquery: $.ajax( { type:“post”, dataType:“json”, contentType: ‘application/json’, url:“http://192.168.X.XXX:8000/post”,(nodejs服务器的地址) data:{“name”:“111”,“gender”:“女”}, … } 结果是:能正常访问服务器返回的数据,但是服务器端拿不到req.body的值,显示为body=={}

我把$.ajax中的的contentType 删除后(contentType默认为application/x-www-form-urlencoded),就可以拿到req.body的值,显示body=={“name”:“111”,“gender”:“女”}

这是为什么?不能自定义contentType的值?

2 回复

你好,我查了一下文章:

http://api.jquery.com/jquery.ajax/,告诉你可以使用默认的 application/x-www-form-urlencoded, multipart/form-data, or text/plain 这三种,其它的也可以,但是需要告诉ajax 的怎样序列化它。

https://stackoverflow.com/questions/14322984/differences-between-contenttype-and-datatype-in-jquery-ajax-function 这篇文章告诉你,datetype 和 contentType 的区别。

https://stackoverflow.com/questions/2845459/jquery-how-to-make-post-use-contenttype-application-json 这篇文章告诉你如何使用 contentType

https://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data 这篇文章告诉你如何 application-x-www-form-urlencoded 的区别

好吧,我来告诉你:

get 和 post 请求参数中,基本上都是使用这种格式:application/x-www-form-urlencoded,这种格式的特点就是,name/value 成为一组,每组之间用 & 联接,而 name与value 则是使用 = 连接。如: wwwh.baidu.com/q?key=fdsa&lang=zh 这是get , 而 post 请求则是使用请求体,参数不在 url 中,在请求体中的参数表现形式也是: key=fdsa&lang=zh的形式,这种形式在一般的情况下是没有什么问题的,但是在一些复杂的情况下就有问题了。 如果在ajax 中你要传一个复杂的json 对像,也就说是对象嵌数组,数组中包括对象,这样你怎么传:

{
  data: {
    a: [{
      x: 2
    }]
  }
}

如上面这个复杂对象,get 和 post 都没有办法进行传送,因为历史的原因,ajax 只支持简单JSON对象(不带嵌套的)。所以在 ajax 中,你指定的 application/x-www-form-urlencoded 就不能传复杂JSON对象。你可以测试一下。

在正式 html 请求中,除了application/x-www-form-urlencoded 还有一个 multipart/form-data 他是用来上传文件,这个就不讲了。

除了这两种的还有很多其他的类型,其中就有一种叫 application/json 的类型,这种类型的流行,这因为大家都发现了上面说的问题,不支持复杂的JSON对象。而 http 是文本协议,把 json 的对像,用JSON.stringify序列化后,然后发送,在服务器端接到然后用 JSON.parse 进行还原就行了,这样就能处理复杂的对象了。

因此就你上面的问题的,你把你的 data 用 JSON.stringify(data) 处理一下就行了。

至于 bodyParser.json({type:‘application/*+json’}) 默认都是支持是 application/x-www-form-urlencoded 的,你的这个问题就解决了。

我测试了几种情况: 如果设置了applicaiton/json,data 的部分需要JSON.stringify()序列化; 简单的data数据,不设置applicaiton/json,是可以拿到数据的,但是data数据复杂的时候一旦嵌套就拿不到嵌套深的数据了,这时候最好是设置application/json 有一点没测试出来:后台对req.body进行JSON.parse()后是报错的。我想是因为在app.js中已经设置了app.use( bodyParser.json()),默认是已经解析了。

谢谢 htoooth 同学!

回到顶部