node.js原生后台进阶(一)

摘要:
背景可能对我们的前端有点陌生。让我澄清一下我的想法。为了实现数据交互,我们需要编写接口,接口通常分为三类:GET、POST和POST。需要明确的最重要问题是请求的路径名及其携带的参数,例如:http://www.test.com/hahaha/test?name=rick“/haha/test”是路径名,参数是name=rick。首先,GET显然是我们用来输入域名以访问页面的方法。当然,我们也可以使用表单提交、ajax和jsonp来实现它。

后台对于我们前端来说可能真的有点陌生,下面我来理清一下思绪吧。

一个基本的后台要求有如下功能:

1.与前端的数据交互

2.操作数据库(增删改查)

3.操作服务器文件(也大概是增删改查)


本次我们先讨论一下前后端的数据交互吧。

要实现数据交互,我们就要写接口了,接口通常分为3大类:GET、POST(enctype=urlencode)、POST(enctype=multipart/form-data)

写接口最主要弄清楚的问题就是请求的pathname和所带的参数

例如:http://www.test.com/hahaha/test?name=rick,其中“/hahaha/test”就是pathname,参数就是name=rick


一、GET

这个显然就是我们日常输入域名来访问页面所使用的方法了,当然我们还可以用表单提交ajaxjsonp来实现。

GET对比POST请求更加简单,因为GET请求的时候我们不用考虑请求的Body,一切我们需要的东西都只能在Headers中找

GET的参数只能在url上附上,直接上代码吧:

const http = require('http');
const url = require('url');

const server = http.createServer((req,res)=>{
  let {pathname,query} = url.parse(req.url,true);
  console.log(pathname); //这里就是我们想要的api名字
  console.log(query); //这里就是我们想要的参数json
})
server.listen(8080);

二、POST 传值格式为application/x-www-form-urlencoded

所谓urlencoded格式就是形如“a=123&b=abc”这样的参数格式

与GET不同的是除了可以在url上面带参数,还可以在请求Body中带参数,不过这种格式一般是不拿来传文件的,如果放一个<input type="file" name="f1"/>在form里面,提交的时候浏览器只会带上,文件的filename(形如f1=1.txt)

const http = require('http');
const url = require('url');
const querysting = require('querystring');

const server = http.createServer((req,res)=>{
  //和GET一样获取pathname和url上的参数
  let {pathname,query} = url.parse(req.url,true);
  let postData = [],postStr="";
  req.on('data',data=>{
    //先把数据流存在内存,其实这种做法很不好,很快会造成服务器内存不够
    postData.push(data);
  })
  req.on('end',()=>{
    //数据流连接起来
    let postBuffer = Buffer.concat(postData);
    //如果Headers里面的Content-Type是application/x-www-form-urlencoded开头
    if(req.headers['content-type'].startsWith('application/x-www-form-urlencoded')){
      postStr = postBuffer.toString();
      console.log(querysting.parse(postStr)); //来自body的json参数
    }
  })
})
server.listen(8088);

三、POST 传值格式为multipart/form-data

这种格式传回来的数据格式很奇怪,但是我们传文件就是考的这种格式来传

这数据大概是长这样的:

node.js原生后台进阶(一)第1张

上面这段数据是Buffer转String后的结果,很恶心吧~~下面,我们就要将这段数据处理成我们可以用的

Node原生就有Buffer对象,但是Buffer没有内置split方法,所以先给Buffer添加split方法

Buffer.prototype.split = Buffer.prototype.split || function(spliter){
  let _this = this;
  let res = [];
  let index=0;
  while((index=_this.indexOf(spliter))!=-1){
    let res1= _this.slice(0,index);
    let res2 = _this.slice(index+spliter.length);
    res.push(res1);
    _this = res2;
  }
  res.push(_this);
  return res;
}

至于分隔符就在headers['content-type']里面的boundary里

node.js原生后台进阶(一)第2张

然后经过一段比较复杂的操作,我们就得到我们想要的参数了:

function parsePostJson(arr){
  let result = [],tempArry = [];
  arr.forEach(item=>{
    let temp = item.slice(2,item.length-2);
    let index = item.indexOf('

');
    let temp2= temp.slice(0,index);
    let data= temp.slice(index+2);
    tempArry = temp2.split('; ');
    let name = tempArry[1].split('name="')[1].split('"
')[0].toString().replace('"','');
    let tempObj = {
      name,data,
      filename:(tempArry[2]?tempArry[2].split('filename="')[1].split('"
')[0]:'').toString()
    };
    result.push(tempObj);
  })
  return result;
}

let boundary = req.headers['content-type'].split('; ')[1].split('boundary=')[1];
let temp = postBuffer.split('--'+boundary);
temp.pop();
temp.shift();
let result = common.parsePostJson(temp);
console.log(result); //这就获取到我们想要的参数

 处理后的result大概长这样

node.js原生后台进阶(一)第3张

然后有filename的就按照文件的办法处理,例如writeFile(filePath,data,err=>{}),filename为空的说明是普通字符串数据,就直接toString()就好了

免责声明:文章转载自《node.js原生后台进阶(一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇offsetTop、offsetLeft、offsetWidth、offsetHeight、style中的样式性能相关指标详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

帆软—FineBI5.1忘记管理员登录密码及用户名

1、 查找数据库。脚本文件查找数据库。脚本文件。...

Centos-修改文件访问和修改时间-touch

触摸如果文件存在,请更改文件的访问时间和修改时间。如果不存在,请创建一个空的文件相关选项。a将文件访问时间更改为当前系统时间。m将文件修改时间更改为当前系统时间。c如果文件不存在,请不要创建它。d不提示。d指定日期和时间。格式为Y-m-dH:m:S-r递归修改目录下的所有文件和内容...

《学习opencv》笔记——矩阵和图像操作——cvAnd、cvAndS、cvAvg and cvAvgSdv

矩阵和图像的操作cvAnd函数其结构voidcvAnd;程序实例#include#include#includeintmain{IplImage*src1,*src2,*src3;src1=cvLoadImage;src2=cvLoadImage;src3=cvLoadImage;cvAnd;cvShowImage;cvShowImage;cvShowIma...

【工具技巧】:sublime notepad++ 多行编辑

将光标定位到一行-˃ctrl+shift+↑↓, 上下移动一行。选择-˃ctrl+shift后+↑↓, 上下移动所选区域。再次按6:Ctrl+Shift+Enter在光标前插入一行。...

css实现切角效果

html&lt;divclass=“corner”&gt;#58a0);#58a0)右,#58a0)左;3.四个倒角css。角{width:4。圆弧倒角css。右上角(width:#58a0);背景重复:无重复;...

批处理bat脚本自动配置java的jdk环境变量

前言每次更换计算机或重新安装系统时,都需要重新配置java系统路径。但我不想每次都检查配置方法,所以我编写了一个脚本来自动配置。脚本内容@echooff@echo步骤1:输入要设置的JAVA_HOME路径:set/pinput=“请输入JAVA_HOME路径:”@echo步骤2:设置JAVA_ HOME路径setxJAVA_HOME“%input%”/M@e...