【问题标题】:Express js array form field converting into String field nameExpress js数组表单字段转换为字符串字段名称
【发布时间】:2018-08-31 17:08:59
【问题描述】:

在 express js 中我想发布数组表单字段,但它转换为字符串。

示例:HTML 表单

<form>
  <input name="mobile" value="99999999999" />
  <input name="name[]" value="apple" />
  <input name="name[]" value="mango" />
</form>

服务器端

我明白了

{
     mobile: "99999999999",
    'name[0]': "apple",
    'name[1]': "mango"
}

我想要没有单引号的键名。这只发生在数组字段中

{
    mobile: "99999999999",
    name[0]: "apple",
    name[1]: "mango"
}

任何人都可以指导我如何解决它。我尝试了很多,但没有成功。

【问题讨论】:

  • 为什么要不带引号?
  • 因为当我使用request.body.name时我无法获取名称值
  • 但是 name[0] 不是 JavaScript 中的无效属性名称,因此必须引用它吗?
  • 即使是引号也可以通过 request.body['name[0]'] 获取?
  • @ChrisCousins 但是名称是动态的,所以我不知道名称字段的长度?

标签: javascript jquery node.js express


【解决方案1】:

对于bodyParser.urlencoded,如果将extended选项设置为true,格式property[nestedProperty]的属性名称将被bodyParser中间件解释为:

{ property: nestedPropert: $value }

一定要像这样初始化中间件:

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

通过上述更改,您应该能够在表单提交时获取对象

【讨论】:

  • 我在代码中使用了app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: true}));。对吗?
  • app.use(bodyParser.urlencoded({extended: true }));你应该在 app.js 中添加这个
  • 问题出在app.js文件中默认的这一行:app.use(bodyParser.urlencoded({extended: true }));。 (我猜)默认情况下 Express 使用 extended: false 并且必须为 true 才能工作。通过更改服务器配置,您应该能够解决您的问题
  • 我写的代码和你发的一样app.use(bodyParser.urlencoded({extended: true}));
  • 在服务器端再次解析数据 var dataReceived = JSON.parse(req.body);
【解决方案2】:

根据 cmets,这是实现所需结果的解决方法:

我们将从对象中获取键并检查哪个键是数组中的键之一。

这不是推荐的方法,而是一种解决方法。这可能不可读,您可能不想在生产环境中使用它。

var obj = {
  mobile: "1234",
  "name[0]": "one",
  "name[1]": "two",
  "name[2]": "three",
  "teezNameArr[0]": "xx0",
  "teezNameArr[1]": "xx1",
  "par[0]": "par-one",
  "par[1]": "par-something"
};

var arrayFields = ["name", "teezNameArr", "par"];
var regexString = `^(${arrayFields.join("|")})\\[\\d+\\]`;

var regex = new RegExp(regexString);

var newObj = Object.keys(obj)
  .filter(aKey => regex.test(aKey))
  .reduce((combinedObj, aKey) => {
    var keyName = aKey.match(regex)[1];
    if (!combinedObj[keyName]) {
      combinedObj[keyName] = [];
    }
    combinedObj[keyName].push(obj[aKey]);
    return combinedObj;
  }, {});

newObj.mobile = obj.mobile;

console.log(newObj);

【讨论】:

  • 这里我只给出了name字段的例子,但在我的代码中这种类型的多个字段,所以代码很长而且不可编辑。
  • 如果你能告诉我所有的字段,我可以发布更易读和更紧凑的代码
  • name,teezNameArr,par,hcp,hole_latitude,hole_longitude 这是我所有的数组字段。还有更多字段,但只包含字符串
  • 感谢您完成宝贵的任务。但这不是正确的做法。
  • 我知道!我已经在引号中提到了 :) 这只是为了让您知道,如果没有任何效果,那就有这种方法
猜你喜欢
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 2018-06-04
相关资源
最近更新 更多