博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
express 解析post方式下的json参数
阅读量:2193 次
发布时间:2019-05-02

本文共 2177 字,大约阅读时间需要 7 分钟。

来自:

node.js 下最出名的web框架 express ,之前低版本(4.0以下)貌似需要依赖 bodyParser 包来解析请求体,

 查看此博文了解.

后来的版本把 bodyParser 继承进去,

需要在express 配置项里 user(express.bodyParser({ keepExtensions: true, uploadDir: '/tmp' }))  

如下代码:

var express = require('express'),    app = express();app.configure(function () {    app.use(express.bodyParser({ keepExtensions: true, uploadDir: '/tmp' }));});

现在的Express 4.0最新版把 bodyParser 又拿出来了(当然很多之前依赖的插件都拿出来了) 变成了独立的依赖包 body-parser 需要 npm install 来安装使用.

npm install body-parser

Express 4.0以上版本需要在启动文件中做如下配置:

var express = require('express');var bodyParser = require('body-parser');var app = express();var server = require('http').createServer(app);app.use(bodyParser.json({limit: '1mb'}));  //body-parser 解析json格式数据app.use(bodyParser.urlencoded({            //此项必须在 bodyParser.json 下面,为参数编码  extended: true}));

如果你的接口要求post 上来的数据格式是这样的:

{"data":{"name":"张三","age":25}}

后端express 进过 bodyParser 的解析后,可以这样读取到数据

req.body.data.name (获取到张三)

req.body.data.age (获取到年龄)

但是这里是有前提的,客户端请求接口时必须指名请求头类型 Content-Type=application/json

bodyParser 发现这样类型的请求头后,会自动将 body 里的 json 格式数据正确解析,否则 req.body.data 为 undefined

传统的服务器端语言可能会接收post上传的流,然后转成字符串最后在格式化成 json ,这样加不加application/json 请求头都是没有问题的.

但是Express 中间件在解析body中的post参数会检查 Content-Type 类型,所以没有指定正确格式导致中间件解析参数出错.

那如何处理呢?

因为好多地方都在调用你的接口,你无法保证所有的人都在请求头里面加了 Content-Type=application/json 

解决思路是:

服务器端 先用 req.body.data 参数获取参数,如果成功,说明 . 还是按照之前的方法读取.

如果 req.body.data 参数无值或者undefined 那么我们也用流来读取post 数据,然后转成字符串再解析成 json 格式来使用. 直接上代码

app.post('/post', function (req, res) {    if (req.body.data) {        //能正确解析 json 格式的post参数        res.send({"status": "success", "name": req.body.data.name, "age": req.body.data.age});    } else {        //不能正确解析json 格式的post参数        var body = '', jsonStr;        req.on('data', function (chunk) {            body += chunk; //读取参数流转化为字符串        });        req.on('end', function () {            //读取参数流结束后将转化的body字符串解析成 JSON 格式            try {                jsonStr = JSON.parse(body);            } catch (err) {                jsonStr = null;            }            jsonStr ? res.send({"status":"success", "name": jsonStr.data.name, "age": jsonStr.data.age}) : res.send({"status":"error"});        });    }});

转载地址:http://uinub.baihongyu.com/

你可能感兴趣的文章
搞懂分布式技术5:Zookeeper的配置与集群管理实战
查看>>
搞懂分布式技术6:Zookeeper典型应用场景及实践
查看>>
搞懂分布式技术10:LVS实现负载均衡的原理与实践
查看>>
搞懂分布式技术11:分布式session解决方案与一致性hash
查看>>
搞懂分布式技术12:分布式ID生成方案
查看>>
搞懂分布式技术13:缓存的那些事
查看>>
搞懂分布式技术14:Spring Boot使用注解集成Redis缓存
查看>>
搞懂分布式技术15:缓存更新的套路
查看>>
搞懂分布式技术16:浅谈分布式锁的几种方案
查看>>
搞懂分布式技术17:浅析分布式事务
查看>>
搞懂分布式技术18:分布式事务常用解决方案
查看>>
搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务
查看>>
搞懂分布式技术20:消息队列因何而生
查看>>
搞懂分布式技术21:浅谈分布式消息技术 Kafka
查看>>
后端技术杂谈1:搜索引擎基础倒排索引
查看>>
后端技术杂谈2:搜索引擎工作原理
查看>>
后端技术杂谈3:Lucene基础原理与实践
查看>>
后端技术杂谈4:Elasticsearch与solr入门实践
查看>>
后端技术杂谈5:云计算的前世今生
查看>>
后端技术杂谈6:白话虚拟化技术
查看>>