首先,先了解一下关于http协议里定义的四种常见数据的post方法,分别是: 
application/www-form-ulrencoded 
multipart/form-data 
application/json 
text/xml

Express依赖bodyParser对请求的包体进行解析。默认支持application/json,application/www-form-urlencoded,multipart/form-data.单数对xml没有支持。需要自己代码来实现

  • www-form-urlencoded

http默认的post请求是这种方式,比如写一个<form>...<input type="submit/></form>.form表单里面的submit按钮默认就是这种www-form-urlencoded方式提交的

Node.js下使用Express接收这种提交方式需要使用body-parse插件支持,Express和body-parser的依赖关系在4.0以下版本和4.0以上版本是不同的

var express=require("express);
var bodyParser=require('body-parser'); var app=express();
var server=require('http').createServer(app); app.use(bodyParser.urlencoded({extended:true})); var PORT=process.env.PORT||3008;
server.listen(PORT);

该代码搭建起了一个简单的server,在Git bash中输入

$node app

运行起来,就可以接收post的www-form-urlencoded类型的参数

我们在上面的代码中加上一个路由(该路由需要放在监听端口的前面)

app.post('/urlencode',function(req,res){
console.log(req.body);
res.send("success");
});

在html中编写form表单,使用post方法发送请求

<form action='/urlencode' method='post'>
<input type='text' name='user' value='charlene'/>
<input type='submit'>
</form>

当提交表单时,路由中的req.body取得请求信息,并通过res.send方法将响应信息发送给客户端

  • form-data

该数据类型也是常见的提交数据的方式,和上面不同的是form表单里需要有enctype标识。即我们在上传文件时,需要爱form标签中做这样的标识: 
<form enctype="multipart/form-data"></form>

如果是通过ajax方法提交表单,可以XHR2的FormData方法提交处理上传文件的表单。例如表单中含有上传的文件和其他需要提交的字段

`<form method="post" id="form-article">
<label>文章标题:</label>
<input type="text" name="title" placeholder="请输入标题" class="text-input"></input>
<label>文章封面:</label><input type="file" name="postImg" value="上传图片" id="upload">
<input type="submit" >
</form>`

以上的form表单中,含有需要提交的文章标题字段和文章封面的图像上传。当使用ajax实现表单提交时,需要使用xhr2中的FormData类型。 
在下面的代码中,result为将表单提交的字段序列化的结果,为一个key=value形式的字符串。

var upload=document.getElementById("upload");
var formD=new FormData();
for(var i = 0; i < result.length; i++){
var val = result[i].split("=");
formD.append(val[0],val[1]);
}
//如果上传上传的图片不为空,取出上传的图片内容
if(upload.files[0]){
formD.append("file",upload.files[0]);
}
ajax("post","/upload1",null,formD,function(res){
console.log(res);
}

ajax为自己封装的ajax发送请求的方法,想了解此方法 见附录

使用nodejs处理form-data数据,需要引入中间件multer或connect-multiparty,这里我使用multer中间件 关于multer中间件的安装及相关方法及属性,请参见我的上一篇博客

在路由文下,编写form表单请求路由时处理的功能

var upload=require('multerUtil');
app.post('/upload1',upload.single("file"),function(req,res){
console.log(req.body);//req.body中存放一般字段中存在的字段值
//将信息存入文章数据库
console.log(req.file);//req.file中存放上传的文件信息 var post = new Post("cheng", req.body.title, req.body.tags,req.body.post,req.body.cates,req.file.path);
post.save(function (err) {
console.log(post);
if (err) { console.log("error"); } res.send({
user: "cheng",
title: req.body.title,
tags: req.body.tags,
post: req.body.post,
cates: req.body.cates
});
});

});

*注:multerUtil为引入multer中间件,并设置中间件的storage后返回的中间件,设置方法请参照我的上一篇博客

  • application/json

bodyParser支持此类参数的解析。不过如果需要发送json数据,需要对发送请求的请求头设置,如果是ajax上传,设置请求头方法如下

xhr.setRequestHeader=("Content-Type":"application/json");

同时,请求信息的格式需要是json字符串格式,如果是json格式,需要通过JSON.stringify()方法将json格式的数据转化为json字符串格式的数据进行传输,后台node.js 在相应的路由下通过req.body接收请求的信息。

  • text/xml 
    这种请求类型不是特别常见,body-parse默认也不解析这种数据格式,目前腾讯、微信在使用这种数据交换格式,node.js中只能自己编写代码处理,把请求体参数按照字符串读取出来,然后使用xml2json包吧字符串解析成json对象。

首先还是使用body-parse得到字符串,然后再转化

xml格式请求需要指定http请求头content-type=text/xml

利用req上定义的事件data来获取http请求流,end事件结束请求流的处理

利用xml2json把上面得到的请求参数流转化为json对象

首先需要安装xml2json

$npm install xml2json

var xml2json=require('xml2json');

app.post('/xml',function(req,res){
req.rawBody='';
var json={};
req.setEncoding('utf8');
req.on('data',function(req,res){
req.rawBody+=chunk;
});
req.on('end',funciton(){
json=xml2json.toJson(req.rawBody);
res.send(JSON.stringify(json));
});
});

参考文献:node.js下依赖Express实现post 4中方式提交参数

附录:ajax封装的方法

//创建xhr对象
function createXHR(){
if(typeof XMLHttpRequest!="undefined"){
return new XMLHttpRequest();
}else if(typeof ActiveXObject!="undefined"){
if(typeof arguments.callee.activeXString!="string"){
var versions=[
"MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"
],
i,len;
for ( i = 0,len=versions.length; i < len; i++) {
try{
new ActiveXObject(versions[i]);
arguments.callee.activeXString=versions[i];
break;
}catch(ex){ }
}
}
return new ActiveXObject(arguments.callee.activeXString);
}else{
throw new Error("no XHR Object available");
} }
/**
* ajax请求的方法
* @param {string} met 发送请求的类型 值为'post'或‘get’等ajax能接受的请求类型
* @param {string} url 请求的url
* @param {string/json/formdata} mes 发送请求时的请求信息
* @param {Function} callback 请求成功之后需要调用的回调函数
* @return 处理请求后的结果
*/
var ajax=function(met,url,mes,callback){
var xhr=createXHR();
xhr.onreadystatechange=function(){
if(xhr.readyState==1){
console.log("writing");
}
if (xhr.readyState==4) {
if (xhr.status>=200&&xhr.status<300||xhr.status==304) {
callback(xhr.responseText); }else{
console.log("request was unsuccessful:"+xhr.status);
}
}
}
xhr.open(met,url,true);
xhr.send(mes); }

nodejs中req.body对请求参数的解析问题的更多相关文章

  1. nodejs学习笔记<四>处理请求参数

    在web开发中处理请求参数是个非常常见的工作:nodejs提供了了querystring用来处理请求参数. querystring常用方法有:parse,stringify. (1)parse: 解析 ...

  2. Structs2 中拦截器获取请求参数

    前言 环境:window 10,JDK 1.7,Tomcat 7 测试代码 package com.szxy.interceptor; import java.util.Map; import jav ...

  3. java中获取所有的请求参数

    //获取所有的请求参数 Enumeration<String> paraNames=request.getParameterNames(); for(Enumeration<Stri ...

  4. SSH项目中,解决中文请求参数乱码,Filter过滤器不起作用的问题

    1.web.xml配置如下(必须放在Struts2配置之前) <!-- 字符编码过滤器配置--> <filter> <filter-name>CharEncodin ...

  5. nodejs接收post请求参数

    原文 https://blog.csdn.net/u013263917/article/details/78682270#1.2 nodejs接收post请求参数1.1-浏览器发送post请求参数的方 ...

  6. go中处理各种请求方式以及处理接口请求参数

    话不多说直接上代码,解读内容全部在代码中 1.处理请求方式 package main import ( "fmt" "io/ioutil" "net/ ...

  7. SpringBoot系列教程web篇之Post请求参数解析姿势汇总

    作为一个常年提供各种Http接口的后端而言,如何获取请求参数可以说是一项基本技能了,本篇为<190824-SpringBoot系列教程web篇之Get请求参数解析姿势汇总>之后的第二篇,对 ...

  8. SpringBoot系列教程web篇之Get请求参数解析姿势汇总

    一般在开发web应用的时候,如果提供http接口,最常见的http请求方式为GET/POST,我们知道这两种请求方式的一个显著区别是GET请求的参数在url中,而post请求可以不在url中:那么一个 ...

  9. python+pytest接口自动化(6)-请求参数格式的确定

    我们在做接口测试之前,先需要根据接口文档或抓包接口数据,搞清楚被测接口的详细内容,其中就包含请求参数的编码格式,从而使用对应的参数格式发送请求.例如某个接口规定的请求主体的编码方式为 applicat ...

随机推荐

  1. 【C#】基础知识

    C#常用函数表1.DateTime 数字型 System.DateTime currentTime=new System.DateTime(); 1.1 取当前年月日时分秒 currentTime=S ...

  2. 冒泡排序算法的 python 实现与 C 的比较

    昨天用c写了简单的冒泡排序算法之后,正好最近在学 python,也想试试用python实现一下. 总体感觉,对于这种简答的小程序,python 确实充分体现了他简洁,易懂的特点.写起来特别流畅,舒服. ...

  3. scrapy-redis的使用与解析

      scrapy-redis是一个基于redis的scrapy组件,通过它可以快速实现简单分布式爬虫程序,该组件本质上提供了三大功能: scheduler - 调度器 dupefilter - URL ...

  4. MatLab Load cv::Mat 导入数据

    我们有时候在项目中需要将OpenCV中的cv::Mat导入MatLab进行分析与处理,那么如果把数据转过去呢,我们的做法是首先将cv::Mat导出为txt文件,或者是yml文件,请参见我之前的博客Wr ...

  5. 2018牛客网暑期ACM多校训练营(第五场) E - room - [最小费用最大流模板题]

    题目链接:https://www.nowcoder.com/acm/contest/143/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...

  6. CodeForces - 586D Phillip and Trains 搜索。vis 剪枝。

    http://codeforces.com/problemset/problem/586/D 题意:有一个3*n(n<100)的隧道.一个人在最左边,要走到最右边,每次他先向右移动一格,再上下移 ...

  7. 【源码】rm zip 删除文件夹中大量的小文件 百万 扫描文件时间

    rm  删除文件夹中大量的小文件 百万 迟迟未删除 在扫描文件? rm删除命令源码分析 - ty_laurel的博客 - CSDN博客 https://blog.csdn.net/ty_laurel/ ...

  8. JAVA 的wait(), notify()与synchronized同步机制

    转自:http://blog.csdn.net/zyplus/article/details/6672775 在JAVA中,是没有类似于PV操作.进程互斥等相关的方法的.JAVA的进程同步是通过syn ...

  9. LoadRunner-关联报错(解决方法一)

    Action.c(153): Error -35061: No match found for the requested parameter "CorrelationParameter_3 ...

  10. Vue中父子组件执行的先后顺序探讨

    前几天,朋友向我提出了一个关于Vue中父子组件执行的先后顺序问题,相信很多朋友在学习的过程中也会遇到这个问题,所以我就在此提出我自己的一些小看法. 问题如下:请问下图中父子组件执行的先后顺序? 首先, ...