Express.js:POST数据作为req.body对象的KEY而不是req.body的VALUE?

时间:2015-10-18 18:45:24

标签: json node.js post express

来自我正在做的客户:

$.ajax({
        url: '/create',
        type: 'POST',
        data: JSON.stringify({
            theme: "somevalue",
            snippet: {
                name: "somename",
                content: "somevalue"
            }
        }), 
        complete: function (response)
        {

        }
    });
服务器上的

node.js/express.js)我正在做:

var app = express();
app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
.......
... 
app.post('/create', function (req, res)
{
   var dataReceived = req.body;
});

我预计dataReceived的值为:

{
   "theme" : "somevalue",
   "snippet" : {
     "name": "somename",
     "content" : "somevalue"
   } 
}

相反,dataReceived的值为:

{ 
 '{"theme":"somevalue","snippet":"name":"somename","content":"somevalue"}}': '' 
}

这真的很奇怪,我找不到我做错了什么。有什么想法吗?

来自BodyParser module documentation

  

bodyParser.urlencoded(选项)

     

返回仅解析urlencoded主体的中间件。这个解析器   仅接受正文的UTF-8编码并支持自动   gzip和deflate编码的膨胀。

     

在主页上填充包含已解析数据的新主体对象   中间件(即req.body)之后的请求对象。这个对象会   包含键值对,其中值可以是字符串或数组   (当扩展为false时)或任何类型(当扩展为真时)。

这与我的问题有关吗?

4 个答案:

答案 0 :(得分:2)

在客户端删除Stringify

data

或在服务器端再次解析

$.ajax({
        url: '/create',
        type: 'POST',
        data: {
            theme: "somevalue",
            snippet: {
                name: "somename",
                content: "somevalue"
            }
        }, 
        complete: function (response)
        {

        }
    });

答案 1 :(得分:1)

从客户端请求标题中删除此内容类型

 'Content-Type':'application/x-www-form-urlencoded'

答案 2 :(得分:0)

您可以使用VALUE来获取KEY,如下所示:

function getKeyByValue(object, value) {
  return Object.keys(object).find(key => object[key] === value);
}

答案 3 :(得分:0)

如果要使用JSON.stringify,请在客户端Ajax调用上设置此内容类型:

contentType: "application/json"