express接受post的json后格式错误,

前端代码,类似于

var data = {
    keywords: "...",
    name: "123"
};
                
$.ajax({
    url: "url",
    type: "POST",
    dataType: "json",
    data: JSON.stringify(self.getData())
}).done(function (data) {
    // todo
});

express代码

var express = require("express");
var bodyParser = require('body-parser');
var app = express();

app.use(bodyParser.json())
app.use(require('body-parser').urlencoded({ extended: true }))

app.post("/api/url", function (req, res) {
    var test = req.body
    console.log(test)
});

此处的test预想应为

{
    keywords: "...",
    name: "123"
}

实际上是

{
    '{
        keywords: "...",
        name: "123"
    }' : ""
}

如果去掉JSON.stringify,可以获得正确的值,但如果非要用这个的话(前端代码不能修改的情况下)
node这边有什么方法可以获得正确的值么

阅读 6.6k
6 个回答

放开让我来!

问题完全是因为 request 的 Content-Type 有问题!

jQuery Ajax 默认用的是 'application/x-www-form-urlencoded; charset=UTF-8'

也就是说 body 部分默认按照 url 解析方式解析,就是 request.body 部分按照 key=value&foo=bar 方式解析,解析后得到 {key:value,foo:bar}. 你传递一个 JSON.stringify 后的 json string, 那就等价于传递 {"a":1}=, 你把 json string 当 key 了!

正确姿势:contentType: "multipart/form-data"

var data = {
    keywords: "...",
    name: "123"
};
                
$.ajax({
    url: "url",
    type: "POST",
    dataType: "json",
    contentType: "multipart/form-data",
    data: JSON.stringify(self.getData())
}).done(function (data) {
    // todo
});

ajax里去掉JSON.stringify

$.ajax({
    url: "url",
    type: "POST",
    dataType: "json",
    data: self.getData()
}).done(function (data) {
    // todo
});

图片描述

如果一定要加JSON.stringify(),那么在data里加个字段,i.e

$.ajax({
    url: "url",
    type: "POST",
    dataType: "json",
    data: {payload: JSON.stringify(self.getData())}
}).done(function (data) {
    // todo
});

express里这么写:

let dataString = req.body.payload;
let data = JSON.parse(dataString);
console.log(data);
JSON.parse(test)
//你的问题实际上就是想把
let res = {
    '{
        keywords: "...",
        name: "123"
    }' : ""
};

//变成
let res = {
    keywords: "...",
    name: "123"
}

//操作如下
res = Object.keys(res)[0]; //返回字符串 '{keywords: "...",name: "123"}'
res = 'res='+res;
eval(res);
console.log(res) //就是对象这个 {keywords: "...",name: "123"}啦


//上面只是解题思路而已
let res = {'{keywords: "...",name: "123"}' : ""};
console.log(Object.keys(eval(res))) //看看这个哦,?

你试试

let key = Object.keys(test)[0]
console.log(key)
console.log(JSON.parse(key))

看看都是啥。
或者能直接改后端的数据解析格式,但是我忘了怎么改了。。。

直接读取原始请求内容即可

var chunk = Buffer.alloc(0);
req.on('data',function(data){
chunk = Buffer.concat([chunk,data]);
})
req.on('end',function(){
console.log(chunk.toString());
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题