node.js后台进阶(一)

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

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

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

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

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

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

这数据大概是长这样的:

上面这段数据是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里

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

function parsePostJson(arr){
  let result = [],tempArry = [];
  arr.forEach(item=>{
    let temp = item.slice(2,item.length-2);
    let index = item.indexOf(‘\r\n\r\n‘);
    let temp2= temp.slice(0,index);
    let data= temp.slice(index+2);
    tempArry = temp2.split(‘; ‘);
    let name = tempArry[1].split(‘name=\"‘)[1].split(‘\"\r\n‘)[0].toString().replace(‘\"‘,‘‘);
    let tempObj = {
      name,data,
      filename:(tempArry[2]?tempArry[2].split(‘filename=\"‘)[1].split(‘\"\r\n‘)[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大概长这样

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

原文地址:https://www.cnblogs.com/amiezhang/p/8119627.html

时间: 2024-10-15 01:37:18

node.js后台进阶(一)的相关文章

node.js后台快速搭建在阿里云(二)(pm2和nginx篇)

前期准备 阿里云服务器 node.js pm2 express nginx linux(推荐教程:鸟哥的私房菜) 简介 嗯……我只是个前端而已 在第一部分说完了express篇. 后面继续项目的部署,这里主要说说篇pm2和nginx pm2和forever 1.forever 在提到pm2先说说 forever这个东西,使用过node.js可能都是有知道forever这个东西的. 顾名思义,就是让脚本永远的运行,除非你手动写命令去关闭. 关于forever的使用方法有两种,一种是命令行的形式,还

Node.js 切近实战(九) 之Excel在线(在线编辑)

最近实在是太想去西藏了,我自己总是喜欢人少的旅游地,喜欢一望无垠,喜欢蓝天白云大草原. 之前有一节我给大家讲过文件列表,如下,今天我们要讲的就是Excel在线编辑. 当我们双击文件图标的时候会跳转到一个Excel修改界面,如下. ok,这里我们使用的依然是Telerik Kendo UI中的SpreadSheet,看一下这个Spread Sheet是如何用的. 我们定义一个spreadsheet的div,我们看一下这个div怎么生成sheet. $("#spreadsheet").ke

Fundebug上线Node.js错误监控啦

作为全栈JavaScript错误实时监测平台,Fundebug的Node.js实时错误监测服务上线啦,我们能够帮助开发者及时,高效地发现并且解决Node.js错误,从而提高开发效率,并提升用户体验. Fundebug为什么监测Node.js? 程序员通常是比较自信的,他们坚持自己写的代码没有问题.然而,再追问一下自己: 我的代码真的100%没有问题吗? 我做了完整的单元测试吗? 难道我要花更多的时间没完没了的写单元测试? 那么问题在哪? 当Node.js后台程序在服务器上出错了,然而开发者并不知

配置node.js中的express框架

玩node.js,不玩后台那就是杀鸡牛刀,今天没事整理一下以前开发node.js后台的心得 1.首先安装node.js以及cnpm,在这儿我就不说了,看我node.js中的另一篇文章node.js的安装和配置 安装express框架: sudo cnpm install express -g 全局安装express, 之后再安装express生成器,用下面语句就能安装 sudo cnpm install -g express-generator 此时你就可以输入 express -v 查看你所安

node.js前后台交互示例 -- 使用node.js实现用户注册功能

node.js环境自行搭建,参考菜鸟教程的node.js就可以. 1 通过ajax提交index.html中form表单 register.html文件如下: <!doctype html> <html> <head> <meta charset="UTF-8" /> <title>Document</title> <script src="jquery.js"></scrip

《基于Node.js实现简易聊天室系列之引言》

简述:这个聊天室是基于Node.js实现的,完成了基本的实时通信功能.在此之前,对node.js和mongodb一无所知,但是通过翻阅博客,自己动手基本达到了预期的效果.技术,不应该是闭门造车,而是学会分享总结才能进步.因此,我想记录下我的学习心得.不喜勿喷. 技术选型: 数据库:mongodb 实时通信:socket.io 服务器:node.js 后台:node.js 前端js库:jquery 数据库之所以选择mongodb,是因为mongodb是介于关系型与非关系型之间的一款产品,存储格式为

node.js技术文章汇总

下面为我平时学习所看的高质量文章的汇总,以便后面的查阅及总结 API 文档 | Node.js 中文网 npm Node.js安装及环境配置之Windows篇 Node环境变量 process.env 的那些事儿 Jade中文文档 Jade模板 node.js后台jquery前台-- 实现用户登录注册AJAX交互 node+ajax+mysql实现登录注册 NPM install -save 和 -save-dev 傻傻分不清 原文地址:https://www.cnblogs.com/XmanL

node.js配置允许跨域请求,设置允许携带的请求头参数

最近在用node.js写自己的后台时遇见了跨域问题,之前处理跨域都是在前端配置代理解决的,这次打算在后台解决,中途也遇到了一些坑,比如我在请求头里加了一个自定义的参数token,结果后台配置的时候没有允许请求能够携带该参数,造成预检请求发出后,就没任何响应了.为此折腾了半天才发现问题...还是对它不够了解,所以查阅了相关资料,下面做出自己的理解: 都知道跨域是因为浏览器的同源策略造成的,当客户端访问服务端时,如果两端的ip.端口.协议任意一个不同就会产生跨域.下面介绍node.js后台如何配置允

Vue Element+Node.js开发企业通用管理后台系统

第1章 课程介绍介绍项目背景.达到的目标.技术栈和功能演示 第2章 课程分析课程分析 第3章 Vue进阶(上)对Vue的进阶知识进行讲解,包括$emit和$on.directive指令.组件化.Vue插件等相关内容. 第4章 Vue进阶(下)对Vue的进阶知识进行讲解,包括组件通信.过滤器.监听器.Vue2.6重要新特性等相关内容. 第5章 Element-UI入门对Element-UI的内容进行讲解,包括如何搭建Element-UI使用环境,如何使用插件快速集成Element-UI,并通过el