nodejs 怎么解析post进来的json数据?

sai2333
  • 45

问题描述

通过post提交数据,然后node解析后,使用MongoDB插入到集合。
前端要怎么编码这些数据,然后再通过nodejs正确的解析出来?

问题出现的环境背景及自己尝试过哪些方法

使用的是axios进行post请求的,一开始在前端使用JSON.stringify()但是不行,nodejs解析出来是这样的:

data = [{'goodsId':1,'goodsName':'鸡米花','price':10}] ==> {'{'goodsId':1,'goodsName':'鸡米花','price':10}': ''}

nodejs解析后,把我的数据直接变成属性了……。
还试过直接post数据过去后端,但后端拿到的是[obejct object]
通过搜索后,我试了QS模块,使用了Qs.stringify(data),后端终于拿到数据了,但是只能拿一条。如果我试图在data里面添加多一个对象,它无法正确的解析2条数据,会把同样属性的叠加进去。我还是贴图和贴代码吧!

你期待的结果是什么?实际看到的错误信息又是什么?

nodejs代码

const express = require('express');
const app =  express();
const fs = require('fs');
const bodyParser = require("body-parser");
const MongoClient = require("mongodb").MongoClient;
const url = "mongodb://localhost:27017/";

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

app.use(bodyParser.json());
//设置跨域访问
app.all('*',function(req,res,next) {
    res.header('Access-Control-Allow-Origin', '*'); 
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By", ' 3.2.1');
    res.header("Content-Type", "application/json;charset=utf-8");
    next();
})

//食物套餐请求
app.get('/foodmeal',function(req,res) {
    //读取文件
    fs.readFile('foodmeal.json',function(err,data){
        if(err) return console.error(err);
        //响应http请求
        res.send(data);
    });
});
//食物详情请求
app.get('/foods',function(req,res) {
    //读取文件
    fs.readFile('foods.json',function(err,data) {
        if(err) return console.error(err);
        res.send(data);
    });
});

app.post("/settle_post", function (req, res) {
    //在这里面来操作MongoDB数据库
    MongoClient.connect(url,function(err,db) {
        if(err) throw err;
        //链接数据库
        let dbo = db.db('foodmeal');
        //要插入的数据
        console.log(req.body);    
        let myobj = [req.body];
        // console.log(myobj);
        //链接集合,并且插入数据
        dbo.collection('food').insertMany(myobj,function(err,res){
            if(err) throw err;
            console.log('插入了' + res.insertedCount);
            db.close();
        });
    })

    // console.log(req.body);
    res.send();
});


app.listen(3000);
console.log('listening on port 3000...');
{ goodsId: '1',
  goodsName: [ '香辣鸡腿堡', '田园鸡腿堡' ],
  price: [ '18', '15' ],
  count: [ '1,goodsId=2', '1' ] }
//这里是添加了两条数据后显示的解析出来的结果,只有goodsid没被叠加,但不管有没叠加,我希望的是两条数据,然后可以使用MongoDB进行插入

前端代码

            let data = [];
            //this.tableData ==>需要提交的数据
            this.tableData.forEach((item,i) => {
                data[i] =  Qs.stringify(item);
            });

            // let data = Qs.stringify(this.tableData[0]);一条数据的话没问题
            console.log(data);
            axios({
                url:'http://localhost:3000/settle_post',
                method:'post',
                data:data,
                transformRequest: [function(data){
                    return data;
                }],
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                }
            })

因为刚学的node没两天,有些东西不清楚,百度了各种方法还是未得结果,只能求助各位大佬啦!因为小弟知识比较单薄,如果还需要提供什么东西,请在评论里面提醒。谢谢
ps:(目前想到个很浪费的方法,循环数据,然后每条数据进行一次post请求- -)

回复
阅读 6.9k
5 个回答

提交json应该用application/json而不是application/x-www-form-urlencodedapplication/x-www-form-urlencoded会把json数据转化为goodsId='1'&goodsName='香辣鸡腿堡,田园鸡腿堡'body里面。

前端代码改成:


            axios({
                url:'http://localhost:3000/settle_post',
                method:'post',
                data:JSON.stringify(tableData),
                headers: {
                    'Content-Type': 'application/json'
                }
            })

nodejs中用 body-parse这个模块处理一下接收的数据。

application/x-www-form-urlencoded改成application/json,你得告诉服务器数据是json格式的

后端JSON.stringify(你的json)查看数据。
后端for循环你的JSON对象属性读取数据,或者直接通过obj[name]读取对象数据

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏