Node.js body-parser 不会解析 json 中带方括号的输入名称

Posted

技术标签:

【中文标题】Node.js body-parser 不会解析 json 中带方括号的输入名称【英文标题】:Node.js body-parser won't parse input names with square brackets in json 【发布时间】:2015-04-01 16:52:22 【问题描述】:

我在 Node.js 中遇到 Express body-parser 的问题

我有这样的输入:

<input id="personEmail1" type="email" name="person[0][email]" placeholder="Email1" class="form-control">
<input id="personEmail2" type="email" name="person[1][email]" placeholder="Email2" class="form-control">

当我提交表单后,我在 console.log 中得到了这个:

 'person[0][email]': 'info@sss.sss', 'person[1][email]': 'info@ggg.ggg' 

但我希望它以 json 格式解析:

 person: [email: 'info@sss.sss', email: 'info@ggg.ggg'] 

我做错了什么?

【问题讨论】:

我也有同样的问题。这个问题的答案***.com/questions/4295782/…,我没有得到request.body.user.name,而是得到了"user[name]", '...' 【参考方案1】:

当您需要手动安装 body-parser 和 multer 并且想要从帖子中获取嵌套属性时,对于 express 版本 4.x,例如data[test] 形式为req.body.data.test,需要设置:

app.use(bodyParser.urlencoded( extended: true ));

【讨论】:

【参考方案2】:

即使您为密钥使用了有效的 javascript 语法,它们仍然只是字符串,no JSON 解析器会尝试调用 eval

但是,JSON 已经有了数组的概念,它应该按照您期望的方式工作。

向我们展示调用console.log 的代码会很有用。但我猜相反,您需要重新考虑字段名称的命名约定。

<input id="personEmail1" type="email" name="personEmail1" placeholder="Email1" class="form-control">
<input id="personEmail2" type="email" name="personEmail2" placeholder="Email2" class="form-control">

然后根据该数据创建 Javascript 对象。

function handler(req, res) 
   var people = [
      email: req.body.personEmail1 ,
      email: req.body.personEmail2 
   ];

   console.log(people[0]); // person 1
   console.log(people[1]); // person 2
   console.log(people);    // both people

【讨论】:

【参考方案3】:

您正确地使用了 Express 正文解析器中间件括号表示法。但是,作为可以做什么的一个例子......

使用此视图:

<form method="post">
    <label for="person_email_1">Email address 1</label>
    <input id="person_email_1" name="person[0][email]" type="email" value="email1@example.com"> <br>

    <label for="person_email_2">Email address 2</label>
    <input id="person_email_2" name="person[1][email]" type="email" value="email2@example.com"> <br>

    <button type="submit">Submit v1</button>
</form>
<br>
<form method="post">
    <label for="person_email_1">Email address 1</label>
    <input id="person_email_1" name="person[email][0]" type="email" value="email1@example.com"> <br>

    <label for="person_email_2">Email address 2</label>
    <input id="person_email_2" name="person[email][1]" type="email" value="email2@example.com"> <br>

    <button type="submit">Submit v2a</button>
</form>
<br>
<form method="post">
    <label for="person_email_1">Email address 1</label>
    <input id="person_email_1" name="person[email]" type="email" value="email1@example.com"> <br>

    <label for="person_email_2">Email address 2</label>
    <input id="person_email_2" name="person[email]" type="email" value="email2@example.com"> <br>

    <button type="submit">Submit v2b</button>
</form>
<br>
<form method="post">
    <label for="person_email_1_address">Email address 1</label>
    <input id="person_email_1_address" name="person[emailAddresses][0][address]" type="email" value="email1@example.com">
    <input id="person_email_1_description" name="person[emailAddresses][0][description]" type="text" value="lorem ipsum 1"> <br>

    <label for="person_email_2_address">Email address 2</label>
    <input id="person_email_2_address" name="person[emailAddresses][1][address]" type="email" value="email2@example.com">
    <input id="person_email_2_description" name="person[emailAddresses][1][description]" type="text" value="lorem ipsum 2"> <br>

    <button type="submit">Submit v3</button>
</form>

...还有这个帖子处理程序:

function postHandler(req, res) 
    console.log(JSON.stringify(req.body)); // show in console
    res.send(req.body); // show in browser

版本 1(您的版本,适用于我,并返回您想要的结果)req.body:


  "person": [
    "email": "email1@example.com",
    "email": "email2@example.com"
  ]

版本 2a 和 2b(字符串数组,带/不带索引号)req.body:


  "person": 
    "email": [
      "email1@example.com",
      "email2@example.com"
    ]
  

版本 3(对象数组)req.body:


  "person": 
    "emailAddresses": [
      
        "address": "email1@example.com",
        "description": "lorem ipsum 1"
      ,
      
        "address": "email2@example.com",
        "description": "lorem ipsum 2"
      
    ]
  

我个人在 node/Express/jquery/Bootstrap 业务线应用程序上使用了版本 2 和 3,其中个人或企业帐户可以拥有无​​限的电话号码、电子邮件地址和 URL。 body-parser 括号符号让它变得很容易。

【讨论】:

【参考方案4】:

我使用这个https://github.com/macek/jquery-serialize-object 将我的表单序列化为 JSON。它可以根据需要解析数据,并且易于使用。

    $.ajax(
      type: 'post',
      data: $form.serializeJSON(),
      contentType: 'application/json',
      url: $url,
      success: function (result)  ... 
    );

我认为这是最简单的

【讨论】:

以上是关于Node.js body-parser 不会解析 json 中带方括号的输入名称的主要内容,如果未能解决你的问题,请参考以下文章

node.js-Cannot find module 'body-parser'

Node.js - Express会话数据不会持久化

Node.js bodyparser实现原理解析

使用 Express 4 在 Node.js 中解析 JSON 发布请求

即使在 node.js 应用程序中使用 body-parser(使用 CORS 和 HTTPS),req.body 在 POST 中仍然为空

Node.js + Express POST 请求返回未定义