【问题标题】:How to obtain an array of json back from req.body in node.js?如何从 node.js 中的 req.body 获取一个 json 数组?
【发布时间】:2020-08-10 17:00:49
【问题描述】:

我想将一个 json 数组发布到节点 js。我使用 ajax post 方法做了同样的事情。在服务器端,我尝试使用 req.body 访问相同的内容。但结果是字符串的形式。所以我无法一个一个地遍历 json 数组元素。我该怎么做?JSON.parse 或 stringyfy 一切都显示为对象。这是在 req.body 中获得的

      req.body: '[{"img_id":"img_1","name":"abc","source":"img/Icon_ABc.
  png"},{"img_id":"img_0","name":"flower","source":"img/Icon_flower.png"}, 
  {"img_id":"img_5","name":"panda","source":"img/Icon_panda.png"
  }]'

我使用的post方法是ajax。

     Dataform.append("finalAray",JSON.stringify(finalArray))
 $.ajax({
    url: '/api/upload/',
    type: 'POST',
    processData: false,
    contentType: false,
    dataType : 'application/json; charset=utf-8',
    data: Dataform,

    success: function(data){
       //................
    },
    error: function(exception){
        alert('error:'+exception);
    }
});

【问题讨论】:

    标签: javascript node.js json body-parser stringify


    【解决方案1】:

    由于我无法从 req.body 获取数组,因此我已将 JSON 数组作为查询参数发送到 ajax post 的 url 中。所以我在服务器的 req.query 中将数组作为字符串。然后我解析它并能够迭代。

      $.ajax({
        url: '/api/upload/?finalArray='+JSON.stringify(finalArray),
        type: 'POST',
        processData: false,
        contentType: false,
        dataType : 'application/json; charset=utf-8',
        data: fileform,
         success: function(data){
          // ........
        },
        error: function(exception){
            alert('error:'+exception);
        }
    });
    

    在服务器中,

     array=req.query.finalArray;
     JSON.parse(array);
     array.forEach(function(element,index){
            console.log(element);
            console.log(index);
     });
    

    【讨论】:

      【解决方案2】:

      感谢您的测试和更新。我曾假设您仅发布 JSON,而您发布的表单数据包括 JSON。

      我认为在这种情况下最好的方法是使用multer 模块来解析上传的数据,如下所示:

      server.js

      const express = require("express");
      const app = express();
      const port = 3000;
      const multer  = require('multer')
      const upload = multer();
      
      app.use(express.static("./"));
      
      
      app.post('/', upload.any(), function(req,res){
          console.log('Received files from client: ', req.files);
          console.log('Received form data from client: ', req.body);
      
          console.log('Iterating array:');
          let array = JSON.parse(req.body.finalAray);
          array.forEach((element, index) => {
              console.log(`Element at [${index}]: ${element}`)
          });
          res.json( { "status": "ok" } );
      })
      
      
      app.listen(port, function(){
          console.log(`Example app listening at http://localhost:${port}`)
      })
      

      客户

      {     
      Dataform.append("finalAray",JSON.stringify(finalArray))
       $.ajax({
          url: '/api/upload/',
          type: 'POST',
          processData: false,
          contentType: false,
          data: Dataform,
      
          success: function(data){
             //................
          },
          error: function(exception){
              alert('error:'+exception);
          }
      });
      

      【讨论】:

      • 但我没有在迭代中获得值。如问题所示获得 req.body。在迭代它时我收到错误,因为 req.body.for each 不是一个函数.. .@特里
      • 嘿,@Aparna,非常感谢您试用我的代码!你能在服务器上做一个 console.log(req.body) 看看它显示了什么吗?谢谢!
      • '[{"img_id":"img_1","name":"abc","source":"img/Icon_ABc.png"},{"img_id":"img_0","名称":"花","来源":"img/Icon_flower.png"}, {"img_id":"img_5","名称":"panda","来源":"img/Icon_panda.png" }] ' @Terry -- req.body 用单引号括起来。所以它是一个字符串。所以我不能迭代。
      • 我已经用我的 ajax 帖子 calL.content 类型编辑了问题。当我将内容类型指定为 application/json 时,不会上传与 formData 对象中的 json 一起附加的文件。@Terry跨度>
      • 我在req中使用查询来传递json而不是body。这是工作。我不知道这是否是正确的实施方式。但它正在解决我的问题。感谢您尝试此代码。@Terry..我将使用我的新代码编辑我的问题。请检查
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多