Nodejs express如何获取post上来的数组??

Nodejs express如何获取post上来的数组??

请教…express…如何处理post上来的数组, 例如: a[0].id=123 a[0].name=abc a[1].id=234 a[1].name=cdf

我从req.body.a监控看到只能得到以下数据 0].id=12 0].name=ab 1].id=23 1].name=cd

貌似是把第一个中括号和最后一个字符去掉了…我估摸着它是不是把我提交的数据当成a[name]=xx,a[id]=xx来处理了…这样的话…req.body.a.name和req.body.a.id是可以取出来的


9 回复

Node.js Express 如何获取 POST 上来的数组?

当你使用 Express 处理 POST 请求时,经常会遇到需要处理包含数组的请求体。例如,你可能希望接收一个包含多个对象的数组。如果在发送 POST 请求时没有正确地设置请求体格式,可能会导致数据解析错误。

示例场景

假设你发送了如下 POST 请求:

{
  "a": [
    {
      "id": 123,
      "name": "abc"
    },
    {
      "id": 234,
      "name": "cdf"
    }
  ]
}

解决方案

为了确保你的请求体能够被正确解析为数组,你需要确保你的请求体是按照 JSON 格式发送的,并且设置了正确的 Content-Type 头。

示例代码

首先,确保你在客户端(如 Postman 或者前端代码)中正确地设置了请求体和 Content-Type 头。例如,如果你使用 axios 发送 POST 请求,可以这样写:

const axios = require('axios');

axios.post('http://localhost:3000/api/endpoint', {
  a: [
    { id: 123, name: 'abc' },
    { id: 234, name: 'cdf' }
  ]
}, {
  headers: {
    'Content-Type': 'application/json'
  }
})
.then(response => console.log(response.data))
.catch(error => console.error(error));

接下来,在你的 Express 后端处理这个 POST 请求:

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

// 使用 bodyParser 中间件来解析 JSON 请求体
app.use(bodyParser.json());

app.post('/api/endpoint', (req, res) => {
  // 获取 POST 请求中的数组
  const arrayFromRequest = req.body.a;

  // 打印数组内容以验证
  console.log(arrayFromRequest);

  // 返回响应
  res.send({
    status: 'success',
    data: arrayFromRequest
  });
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

关键点解释

  • Content-Type: 设置为 application/json 确保服务器知道请求体是 JSON 格式的。
  • bodyParser.json(): 这个中间件用于解析 JSON 格式的请求体。
  • req.body.a: 通过这种方式可以直接访问到请求体中的数组。

通过上述步骤,你可以正确地在 Express 应用中获取 POST 请求中的数组。


用formidable得到如下数据: fields: { ‘title[0].id’: ‘111’, ‘title[1].id’: ‘222’ } 为什么不是:{title : [{id:‘111’}, {id:‘222’}]}…看来用重写bodyParse()啊

post的时候编码就不对吧,得做成字符串格式。前端编码+服务器端解码,这是基本的道理吧。

给你看个例子~看下对你是不是有帮助~

        $.post("/index?c=login",{v :{"username":"test", "password":"test"}}, function(data){
        if(data.code == 0){
            window.location.href="/index?c=toMainPage";
        } else {
            console.log(data.msg);
        }
    });

获取的方法:

var loginJson = req.body.v;

你不需要post数组,可以把数组转化为json数据,然后post过去~那样就ok啦!

如何解决的呢?

推荐你一个模块 qs,也是tj写的,tj就是通过这个模块在expressjs框架中处理类似情况的。可以用这个模块来代替api中的 querystring.parse() 方法。 还有种需求就是客户端发送

user.face=aaa
user.name=bbb

需要解析为

{user:
{
face:aaa, 
name:bbb
}
}

qs模块式无法胜任了,只能自己写了,参考: https://github.com/DoubleSpout/rrestjs/blob/master/lib/RestReqParam.js

那只有在数据上传上来之后,解析的时候增加if判断了,会影响性能的,我不想这么做

要使用Express获取POST请求中的数组,你可以使用body-parser中间件将请求体解析为JSON对象。这样可以确保数据以预期的方式进行解析。

以下是一个示例代码:

示例代码

首先,确保安装了expressbody-parser

npm install express body-parser

然后,在你的Express应用中添加必要的中间件:

const express = require('express');
const bodyParser = require('body-parser');

const app = express();

// 使用body-parser中间件解析JSON格式的请求体
app.use(bodyParser.json());

app.post('/submit', (req, res) => {
    // 获取请求体中的数组
    const array = req.body.a;

    if (!array || !Array.isArray(array)) {
        return res.status(400).send({ error: 'Invalid data format' });
    }

    // 打印数组内容
    console.log(array);

    // 返回成功响应
    res.send({ success: true, data: array });
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. 安装依赖:确保你已经安装了expressbody-parser模块。
  2. 引入模块:引入expressbody-parser模块。
  3. 配置中间件:使用bodyParser.json()中间件来解析JSON格式的请求体。
  4. 处理POST请求:在路由处理函数中,从req.body.a获取数组。
  5. 验证数据:检查req.body.a是否存在并且是一个数组。
  6. 返回结果:打印数组内容,并返回成功响应。

注意事项

  • 确保你的客户端发送的数据格式正确。例如,使用application/json作为Content-Type,并且发送一个包含数组的对象。
  • 如果你使用表单提交,需要确保表单的enctype="multipart/form-data"或使用bodyParser.urlencoded中间件来解析URL编码的请求体。

通过这种方式,你可以正确地接收和处理POST请求中的数组。

回到顶部