Express中间件body-parser
在http请求种,POST、PUT、PATCH三种请求方法中包含着请求体,也就是所谓的request,在Nodejs原生的http模块中,请求体是要基于流的方式来接受和解析。
body-parser是一个HTTP请求体解析的中间件,使用这个模块可以解析JSON、Raw、文本、URL-encoded格式的请求体,
Node原生的http模块中,是将用户请求数据封装到了用于请求的对象req中,这个对象是一个IncomingMessage,该对象同时也是一个可读流对象。在原生Http服务器,或不依赖第三方解析模块时,可以用下面的方法请求并且解析请求体
const http = require('http');
http.createServer(function(req, res){
if(req.method.toLowerCase() === 'post'){
let body = '';
//此步骤为接收数据
req.on('data', function(chunk){
body += chunk;
});
//开始解析
req.on('end', function(){
if(req.headers['content-type'].indexOf('application/json')!==-1){
JSON.parse(body);
}else if(req.headers['content-type'].indexOf('application/octet-stream')!==-1){
//Rwa格式请求体解析
}else if(req.headers['content-type'].indexOf('text/plain')!==-1){
//text文本格式请求体解析
}else if(req.headers['content-type'].indexOf('application/x-www-form-urlencoded')!==-1){
//url-encoded格式请求体解析
}else{
//其他格式解析
}
})
}else{
res.end('其他方式提交')
}
}).listen(3000)
Express框架默认使用body-parser作为请求体解析中间件,在创建了Express项目之后,可以在app.js文件中找到
/* 引入依赖项 */
var express = require('express');
// ……
var bodyParser = require('body-parser'); var routes = require('./routes/index');
var users = require('./routes/users'); var app = express(); // …… // 解析 application/json
app.use(bodyParser.json());
// 解析 application/x-www-form-urlencoded
app.use(bodyParser.urlencoded());
这样就可以在项目的application级别,引入了body-parser模块处理请求体。在上述代码中,模块会处理application/x-www-form-urlencoded、application/json两种格式的请求体。
经过这个中间件后,就可以在所有路由处理器的req.body中访问请求参数
在实际项目中,不同路径可能要求用户使用不同的内容类型,body-parser还支持为单个express路由添加请求体解析,比如
var express = require('express');
var bodyParser = require('body-parser');
var app = new express();
//创建application/json解析
var jsonParser = bodyParser.json();
//创建application/x-www-form-urlencoded
var urlencodedParser = bodyParser.urlencoded({extended: false});
//POST /login 中获取URL编码的请求体
app.post('/login', urlencodedParser, function(req, res){
if(!req.body) return res.sendStatus(400);
res.send('welcome, ' + req.body.username);
})
//POST /api/users 获取JSON编码的请求体
app.post('/api/users', jsonParser, function(req,res){
if(!req.body) return res.sendStatus(400);
//create user in req.body
})
<<指定请求类型>>
body-parser还支持为某一种或者某一类内容类型的请求体指定解析方式,指定时可以通过在解析方法中添加type参数修改指定Content-Type的解析方式。
比如,对text/plain内容类型使用JSON解析
app.use(bodyParser.json({type: 'text/plain'}))
这一选项更多是用在非标准请求头中的解析
// 解析自定义的 JSON
app.use(bodyParser.json({ type: 'application/*+json' })) // 解析自定义的 Buffer
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' })) // 将 HTML 请求体做为字符串处理
app.use(bodyParser.text({ type: 'text/html' }))
<<body-parser模块的API>>
当请求体解析之后,解析值会被放到req.body属性中,当内容为空时候,为一个空对象{}
---bodyParser.json()--解析JSON格式
---bodyParser.raw()--解析二进制格式
---bodyParser.text()--解析文本格式
---bodyParser.urlencoded()--解析文本格式
来源:https://www.jianshu.com/p/cd3de110b4b6
Express中间件body-parser的更多相关文章
- Node.js连接Mysql,并把连接集成进Express中间件中
引言 在node.js连接mysql的过程,我们通常有两种连接方法,普通连接和连接池. 这两种方法较为常见,当我们使用express框架时还会选择使用中间express-myconnection,可以 ...
- 1.express中间件的简介
express中间件的意思 1, 中间件是一个模块.在js中,模块意味着函数,所以中间件是一个函数.那么这个函数长什么样子? 这还要从中间件的功能说起,它拦截http 服务器提供的请求和响应对象,执行 ...
- Express中间件的原理及实现
在Node开发中免不了要使用框架,比如express.koa.koa2拿使用的最多的express来举例子开发中肯定会用到很多类似于下面的这种代码 var express = require('exp ...
- vue+webpack+express中间件接口使用
环境:vue 2.9.3; webpack 目的:接口的调用 跨域方式: 1.express中间的使用 2.nginx代理 3.谷歌浏览器跨域设置 -------------------------- ...
- express 中间件
[express 中间件] 中间件(Middleware) 是一个函数,它可以访问请求对象(request object (req)), 响应对象(response object (res)), 和 ...
- express中间件原理 && 实现
一.什么是express中间件? 什么是express中间件呢? 我们肯定都听说过这个词,并且,如果你用过express,那么你就一定用过express中间件,如下: var express = re ...
- Express中间件
一.编写中间件 中间件函数能够访问请求对象(req),响应对象(res),应用程序的请求/响应循环中的下一个中间件函数.下一个中间件函数通常由名为next的变量来表示. 中间件函数可以执行以下任务: ...
- express中间件的理解
参考 :https://blog.csdn.net/huang100qi/article/details/80220012 Express中间件分为三种内置中间件.自定义中间件.第三方中间件 可以与n ...
- 浅析express以及express中间件
一.express: 1.express: Express是什么? Express是基于node.js平台的web应用开发框架: 作用:可以实现快速搭建骨架: 优点:开发web应用更加方便,更加快捷. ...
- Express中间件简单的实现原理
上一篇理解Express的使用之后, 再总结一篇Express中间件的简单实现原理. 我们知道Express中间件就是一个个的函数, 那么怎么让这些函数有序的执行呢? 那就需要我们调用 next 函数 ...
随机推荐
- 深入理解JAVA虚拟机 晚期(运行期)优化(转载)
这一章节的内容实用性不强 所以不再手打笔记 转载了一篇 原文地址是http://blog.csdn.net/qq_27350929/article/details/54837595 在部分的商用虚拟机 ...
- SpringMVC POJO传参方式
有两POJO类 Address.java package com.proc; public class Address { private String province; private Strin ...
- Django ckeditor增加编辑代码 功能
前言 使用ckeditor这个组件的时候 对于长写博客的同学当然希望能有 增加代码这个功能按钮 而这个按钮 需要自己配置 我们的编辑器自然需要添加代码块的功能. 需要用到插件codesnippet,c ...
- LOJ-6278-数列分块入门2(分块)
链接: https://loj.ac/problem/6278 题意: 给出一个长为 的数列,以及 个操作,操作涉及区间加法,询问区间内小于某个值 的元素个数. 思路: 分块,用vector维护每个区 ...
- C++ 遍历循环表达示 auto, auto&, auto&&
for(auto x : range) 创建拷贝,无法修改range中的元素 for(auto& x : range) 可以修改range中的元素,但一般用以下这种 for(auto& ...
- UML中共有5种静态图
用例图,类图,对象图,组件图和配置图.
- MyEclipse更改项目名web发布名字不改问题
步骤: 右键项目-->选择propertis-->MyEclipse-->Project Facets-->Web-->右侧更改Web Context-root 如下图:
- 洛谷 P5022 旅行——题解
发现大部分题解都是O(n^2)的复杂度,这里分享一个O(n)复杂度的方法. 题目传送 首先前60%的情况,图是一棵无根树,只要从1开始DFS,每次贪心走点的编号最小的点就行了.(为什么?因为当走到一个 ...
- 微信小程序POST请求参数传递不到后台, 前台获取不到后端返回的数据, 以及 post 请求返回 404 但后台能收到数据
1 微信小程序POST请求参数传递不到后台 需要在微信请求 wx.request 改变默认 header 配置为如下 wx.request({ url: 'test.php', //仅为示例,并非真实 ...
- 详解cocos2dx 3.0的release版本在android平台的签名过程
当您的游戏准备发布前,需要编译成为release版本,命令中需要增加 -m release,编译命令如下: cocos compile -p android -m release 在编译结束后,生成x ...