【问题标题】:Express.js : POST data as KEY of a req.body object instead of VALUE of req.body?Express.js:将数据作为 req.body 对象的 KEY 而不是 req.body 的 VALUE 发布?
【发布时间】:2016-01-17 01:21:45
【问题描述】:

来自我正在做的客户:

$.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)。该对象将 包含键值对,其中值可以是字符串或数组 (当扩展为假时),或任何类型(当扩展为真时)。

这和我的问题有关吗?

【问题讨论】:

  • 你不需要在前端对请求进行 JSON.stringify。

标签: json node.js post express


【解决方案1】:

在你的客户端移除 Stringify

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

        }
    });

或者在服务器端再次解析

app.post('/create', function (req, res)
{
   var dataReceived = JSON.parse(req.body);
});

【讨论】:

  • 你是对的!我仍然不知道什么时候应该对我的数据进行字符串化,什么时候不应该......无论如何......谢谢!
  • 我认为如果您在客户端和服务器上都使用 javascript,那么就不需要 stringify 了!
【解决方案2】:

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

contentType: "application/json"

【讨论】:

    【解决方案3】:

    只需从客户端请求标头中删除此内容类型

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

    【讨论】:

      【解决方案4】:

      您可以像这样使用 VALUE 获取 KEY:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-06
        • 1970-01-01
        • 2019-01-18
        • 2017-10-02
        • 2020-09-13
        • 2021-08-06
        • 2012-02-28
        相关资源
        最近更新 更多