当前位置: 首页 > 后端技术 > Node.js

NodeJS服务端数据处理(表单、json字符串和普通字符串)

时间:2023-04-03 20:50:29 Node.js

阅读原序从浏览器向服务端提交数据时,通常有表单提交、JSON字符串提交和普通字符串提交,不同的情况需要不同的请求头信息告诉服务器客户端可以直接解析的数据格式。如果发送的数据是json字符串,后两种都可以成功发送到服务端,但是如果加上请求头信息,服务端更容易判断使用什么格式。返回数据。querystring模块解析请求体。在get请求中,我们可以通过url模块的parse方法进行解析。如果是有请求体的请求类型,比如post、put,我们应该使用querystring模块的parse方法将请求体中的数据解析成一个对象,这个方法中有三个参数。str:要解析的查询字符串;sep:查询字符串中键值对之间的分隔符,默认为&;eq:查询字符串中key和value之间的分隔符,默认为=。//文件:querystring-test.jsconstquerystring=require("querystring");letstr1="name=pandashen&age=27";letstr1="name*pandashen!&age*27";letobj1=querystring.parse(str1);letobj2=querystring.parse(str2,"!&","*");console.log(obj1);//{name:'pandashen',age:'27'}console.log(obj2);//{name:'pandashen',age:'27'}querystring也是一个很常用的模块。这里我再多说几句原理。模拟querystring模块常用方法解析的代码如下。//File:my-querystring.jsexports.parse=(str,sep="&",eq="=")=>{//存储解析出键值的对象letquery={};//首先查询字符串被切割成[k=v,k=b]letfields=str.split(sep);//循环将每个项目分成k和v并将它们存储在queryObjfields.forEach(field=>{let[key,value]=field.split(eq);query[key]=value;});//返回查询对象returnquery;};服务端的实现将请求头作为Content-Type发送给服务端,表单提交时,使用json和string作为请求体,Content-Type中对应的值为application/x-www-form-分别是urlencoded、application/json和text/plain。其中text/plain是Ajax默认的提交方式。我们在服务端对以上几种请求头进行处理并获取请求,将发送的数据再次返回给客户端。//文件:server.jsconsthttp=require("http");consturl=require("url");constquerystring=require("querystring");constserver=http.createServer((req,res)=>{//获取获取请求参数let{query}=url.parse(req.url,true);//获取数据类型请求头lettype=req.headers["content-type"];//接收数据letbuffers=[];res.on("data",data=>buffers.push(data));res.on("end",()=>{//合并数据并设置默认响应头和返回数据letdata=Buffer.concat(buffers).toString();letcontentType="application/json";//判断是否为get请求,如果是则返回直接解析数据,如果没有则判断请求类型因此if(type==="application/x-www-form-urlencoded"){data=JSON.stringify(querystring.parse(str));}elseif(type==="application/json"){data=JSON.stringify(JSON.parse(str));}else{contentType="文本/纯文本";}}//设置响应头和返回数据res.setHeader("Content-Type",contentType);res.end(数据);});});server.listen(3000,()=>{console.log("serverstart3000");}当请求类型为get时,通过url模块解析URL的查询字符串,然后处理成字符串返回给客户端,当请求类型为post时,设置默认响应头为application/json,如果是表单提交,请求体中的内容为查询字符串格式,使用querystring解析然后用JSON.stringify处理成字符串返回,如果是json,用JSON.parse解析,用JSON.stringify处理成字符串返回,如果是text/plain的默认值,将响应头的值设置为text/plain,直接返回读取的结果,使用客户端进行测试这里为了方便我们不用浏览因为上面的服务端代码比较简单,只处理数据,不处理静态文件请求,所以我们通过NodeJS实现客户端。1.获取请求//file:get.jsconsthttp=require("http");letconfig={host:"localhost",port:3000,path:"/?name=pandashen&age=27"};//发送getrequesthttp.get(config,res=>{//接收服务器返回的数据letbuffers=[];res.on("data",data=>buffers.push(data));res.on("end",()=>{letdata=Buffer.concat(buffers).toString();console.log(data);});});启动服务器server.js,通过命令行执行nodeget.js,查看命令窗口中输出的结果。2.Post请求表单提交//File:post-from.jsconsthttp=require("http");letconfig={host:"localhost",port:3000,method:"post"headers:{"Content-type":"application/x-www-form-urlencoded"}};http.request(config,res=>{//接收服务器返回的数据letbuffers=[];res.on("data",data=>buffers.push(data));res.on("end",()=>{letdata=Buffer.concat(buffers).toString();console.log(data);});}).end("名字=熊猫神&年龄=27");启动服务端server.js,通过命令行执行nodepost-form.js,在命令行窗口查看输出结果。3.post请求json字符串数据//file:post-json.jsconsthttp=require("http");letconfig={host:"localhost",port:3000,method:"post",headers:{"Content-Type":"application/json"}};http.request(config,res=>{//接收服务器返回的数据letbuffers=[];res.on("data",data=>buffers.push(data));res.on("end",()=>{letdata=Buffer.concat(buffers).toString();console.log(data);});}).end("{姓名:熊猫神,年龄:27}");启动服务端server.js,通过命令行执行nodepost-json.js,在命令行窗口查看输出结果。4.post请求普通字符串数据//file:post-string.jsconsthttp=require("http");letconfig={host:"localhost",port:3000,method:"post",headers:{"Content-Type":"text/plain"}};http.request(config,res=>{//接收服务器返回的数据letbuffers=[];res.on("data",data=>buffers.push(data));res.on("end",()=>{letdata=Buffer.concat(buffers).toString();console.log(data);});}).end("pandashen27");启动服务端server.js,通过命令行执行nodepost-string.js,在命令行窗口查看输出结果。小结通过本文的内容,可以了解HTTP在数据传输中的类型,即请求头的类型。服务端可以通过请求头的类型返回客户端可以直接解析的数据。以上只是向服务器提交数据最常用的类型。类型,涵盖表单提交和Ajax等,还有上传文件时的二进制传输等等。