一、http协议

是浏览器和web服务器之间的通信协议

1.通用头信息

request url:请求的url,向服务器请求的数据

request method:请求的方式   get、post

status code:响应的状态码

2.响应头信息

connection:连接方式,keep-alive持久连接

Content-Type:响应的文件类型

Content-Enncoding:压缩类型gzip

data:响应的时间

transfer-Ending:响应的传输方式

location:响应的重定向

3.请求头信息

Accept:客户端接受的文件类型有哪些

Accept-Encoding:客户端接受的压缩类型有哪些

Accept-Language:客户端接受的语言类型

Connection:连接方式  keep-alive 持久连接

4.请求主体

可有可无,客户端向服务器端请求的数据

二、http模块

既可以模拟浏览器向web服务器发请求,也可以创建web服务器

1.模拟浏览器

http.get(url,callback);

get:请求的方法

url:请求的URL

callback:回调函数,用于获取服务器端的响应

res:响应的对象

res.statsCode:响应的状态码

res.on(‘data’,function(buf){})

buf就是响应的数据,格式为buffer

1.创建web服务器

var server = http.createServer();//创建web服务器

server.listen(xxx)//分配端口,监听xxx端口的变化

server.on(‘request’,function(req,res){})

//通过事件来接收浏览器的请求,当有请求自动触发该事件

res  响应对象

writeHead(状态码,头信息)  设置响应的头信息

write(文本)  设置响应的文本内容

end()  结束响应

req  请求的对象

url  获取请求的URL

method  获取请求方法

headers  获取请求的方法

headers  获取请求头信息

const http = require('http');

//创建web服务器

var server = http.createServer();

//监听端口8081

server.listen(8081);

//接收浏览器的请求

server.on('request',function(req,res){

//根据请求的URL来做出不同响应

switch(req.url){

case '/login':

res.write('this is login page');

break;

case '/member':

res.write('this is member page');

break;

case '/':

res.writeHead(302,{

location:'/member'

});

break;

default:

//如果以上所有的url都没有对应的响应

res.writeHead(404,{});

res.write('404 not found');

}

//结束响应

res.end();

});

三、express框架

基于nodejs平台的web开发框架

官网:http://www.expressjs.com.cn

下载:npm install express

const express = require(‘express’);  //引入express模块

var server = express();  //创建web服务器

server.listen(xxx);  //监听端口xxx

1.路由

浏览器向web服务器发请求,web服务器会根据请求的URL和请求的方法做出响应

路由三要素:请求的URL、请求的方法、回调函数(接收请求、做出响应)

注意:路由传参不是通过http协议传递的

响应对象-res

sendStatus()  设置响应的状态码

Send() 响应文本,只能使用一次,如果是数字被认为状态码

sendFile()  响应文件,必须使用绝对路径(_dirname)

redirect()   响应重定向,跳转到另一个URL

练习:创建多个路由

请求方法get,请求的URL /login  响应一个html文件

请求方法get,请求的URL /code  响应一个400状态码

请求方法get,请求的URL /detail  响应一行文本

请求对象-req

method 获取请求方法

url 获取请求的URL

headers 获取请求的头信息

query 获取请求的URL中的查询字符串,并将它解析为对象

2.路由传参(传数据)

设置路由中接收的名称

server.get(‘/product/:lid’,function(req,res){

req.params  //获取路由传递数据,返回对象

});

浏览器中请求并传递

http://127.0.0.1/xxx/10

3.post请求

post请求通过表单提交,服务器端是通过事件来获取post请求的数据

Req.on(‘data’function(buf){

Buf:传递的数据,格式是buffer,需要转为普通字符串,转换后是查询字符串,需要借助查询字符串模块解析为对象

});

eg:使用post和get请求完成注册(用户名,密码,手机,邮箱),服务器端获取注册的数据

 <h1>get注册页面</h1>
<form method="get" action="/myreg">
用户:<input type="text" name="uname"><br>
密码:<input type="text" name="upwd"><br>
手机:<input type="text" name="phone"><br>
邮箱:<input type="text" name="email"><br>
<input type="submit">
</form>
<!--
<h1>post注册页面</h1>
<form method="post" action="/myreg">
用户:<input type="text" name="uname"><br>
密码:<input type="text" name="upwd"><br>
手机:<input type="text" name="phone"><br>
邮箱:<input type="text" name="email"><br>
<input type="submit">
</form>
--> //引入express第三方框架
const express = require('express');
const querystring = require('querystring');
//创建web服务器
var server = express();
//监听端口
server.listen(8080);
//请求得到一个html文件
//路由:get /login server.get('/login',function(req,res){
res.sendFile(__dirname + '/02_post.html');
});
//获取post请求数据
//通过事件:当浏览器端有请求数据自动触发
server.post('/mylogin',function(req,res){
//获取post请求数据
//通过事件:当浏览器端有请求数据,自动触发
req.on('data',function(buf){
var qs = buf.toString();
//使用查询字符串模块解析为对象
var obj = querystring.parse(qs);
console.log(obj); });
res.send('登录成功');
}); server.get('/reg',function(req,res){
res.sendFile(__dirname + '/reg.html');
});
server.post('/myreg',function(req,res){
req.on('data',function(buf){
//由buffer数据转为查询字符串
var data = buf.toString();
//将查询字符串解析为对象
var obj = querystring.parse(data);
console.log(obj);
});
res.send('注册成功');
}); //get /myreg
server.get('/myreg',function(req,res){
res.send('使用get注册成功');
console.log(req.query);
});

4.get请求

get请求以查询字符串的方式传递数据,在路由中使用req.query属性来获取数据

get和post请求的区别:

①get请求安全性较低,速度快,地址栏会暴露信息,浏览器会缓存,一般搜索、查询使用get,浏览器地址栏达到一定程度无法使用get请求

②post请求安全性高,速度慢,不会再浏览器地址暴露信息,一般在登录,注册使用post,post请求实际也做了地址的拼接,是在浏览器内部执行的

四、路由器

路由在使用过程中,不同的模块可能出现相同的URL,把同一个模块下的所有路由归纳到一个路由器,访问形式需要使用路由器

注意:使用路由器是为了防止URL冲突

1.路由器是一个自定义模块

const express = require(‘express’);

bar router = express.router();  //创建空的路由器对象

router.get(‘/list’,function(req,res){});  //往路由器中添加路由

module.exports = router;  //导出路由器

2.在web服务器使用

const userRouter = require(./user.js);  //引入路由器

server.use(‘/user’,userRouter);  //把用户路由器挂在到/user下,访问形式为/user/list...

五、中间件

中间件为主要的业务逻辑提供服务

中间件分为:应用级中间件、路由级中间件、内置中间件、第三方中间件、错误处理中间件

1.应用级中间件

每个中间件就是在调用一个函数,需要配合其他的中间件或者路由使用

server.use(回调函数);  拦截所有的路由,所有路由自动调用回调函数

server.use(‘/url’,回调函数);  拦截特定的路由,只有路由中URL为/url才能调用回调函数

eg:创建路由(get/view)响应当前的浏览次数,每次请求,响应次都会自动加1

 const express = require('express');
var server = express();
server.listen(8080);
/*
初始化浏览次数为0
添加中间件拦截/view,让浏览次数加1
*/
var count = 0;
server.use('/view',function(req,res,next){
count++;
next();
});
server.get('/view',function(req,res){
//响应浏览次数
res.send('一共浏览了:'+ count.toString() + '次');
});

2.路由级中间件

用于服务器中将路由器挂在到特定的URL

server.use(‘/user’,userRouter);

3.内置中间件

在express中只要一个内置的中间件,叫托管静态资源

Server.use(express.static(‘要托管的目录’));

注意:在托管的时候,如果同时托管多个目录,在执行的时候会按照先后顺序

托管静态资源到特定目录,如果浏览器请求静态资源,则自动到该目录下寻找

eg:托管login.html到public目录下,浏览器请求得到该文件,在表单中将用户名和密码使用post请求发给web服务器

 <form method = "post" action="/mylogin">
用户:<input type="text" name="uname"><br>
密码:<input type="password" name="upwd"><br>
<input type="submit" value="登录">
</form>
const express = require('express');
const querystring = require('querystring');
//引入第三方中间件
const bodyParser = require('body-parser');
var server = express();
server.listen(8080);
//使用body-parser中间件
//urlencoded:将post请求的数据解析为对象
//extended:是否使用qs模块将查询字符串解析为对象,false表示不适用第三方qs,是使用querystring
server.use(bodyParser.urlencoded({
extended:false
}));
server.use(express.static('public'));
server.post('/mylogin',function(req,res){
/*req.on('data',function(buf){
//由buffer数据转为查询字符串
var data = buf.toString();
//将查询字符串解析为对象
var obj = querystring.parse(data);
console.log(obj);
});*/
//前提:已经配置好body-parser中间件
console.log(req.body);
res.send('登录成功');
});

4.第三方中间件

就是第三方模块的形式,使用的时候需要先引入body-parser中间件的使用,作用是将post请求数据解析为对象

可以直接把post请求解析为对象

Const bodyParser=require(‘body-parser’);//引入模块

//引入body-parser

server.use(bodyParser.urlencoded({

extended:false

}));

urlencoded:将post请求数据格式为对象

extended:不适用第三方qs模块,使用核心模块

querystring:将查询字符串格式化为对象

注意:在路由中获取post请求数据:req.body返回对象

六、mysql模块

连接mysql数据库服务器

mysql.exe -h127.0.0.1 -p3306 -uroot -p

进入数据库 use xxx;

Insert into emp values(...);

Delete from emp where uid = xxx;

Update emp set ename = ‘xxx’,sex = xxx where eid = xxx;

Select eid,ename from emp;

1.普通连接

 //引入mysql模块
const mysql = require('mysql');
//创建连接
var connection = mysql.createConnection({
host:'localhost',
port:'',
user:'root',
password:'xxx',
database:'xxx'
});
//执行连接
connection.connect();
var sql = 'select * from emp';
//执行sql语句
connection.query(sql,(err,result)=>{
if(err) throw err;
//打印sql语句的结果
console.log(result);
});
//释放资源
connection.end();

2.使用连接池

var pool = mysql.createPool({});  创建连接池对象,传递主机名,端口,用户名,密码,

使用的数据库,连接池大小

pool.query(sql,callback)

七、服务器

1.web服务器(app.js)

1.1托管静态资源到public

1.2使用body-parser中间件

1.3使用路由器挂在到指定的位置

2.路由器(routes.js)

2.1引入连接池模块

2.2创建路由器对象

2.3往路由器中添加路由

2.4在路由中使用连接池

2.5导出路由器

3.连接池模块(pool.js)

3.1创建连接池对象

3.2导出连接池对象

http协议、模块、express框架以及路由器、中间件和mysql模块的更多相关文章

  1. express框架安装及中间件原理

    本文主要介绍express中间件的原理,来应对面试. 1.安装express及初始化: npm install express-generator -g   =>   express expre ...

  2. 原生http模块与使用express框架对比

    node的http创建服务与利用Express框架有何不同 原生http模块与使用express框架对比: const http = require("http"); let se ...

  3. 1 ~ express ~ 初始化。安装第三方模块express。中间件

    一,初始化 二,安装第三方模块express 三,安装中间件 1,bodyParser : 解析 post 请求数据 2,cookies : 读写 cookie 3,swig :模板解析引擎 4,mo ...

  4. Node.js Express 框架学习

    转载:http://JavaScript.ruanyifeng.com/nodejs/express.html#toc0 感觉很牛的样子,不过觉得对初学者没太大用,里面很多例子用的api都没有详细的说 ...

  5. 使用node中mysql模块连接本地数据库

    连接数据库的方法迄今为止学了三种: cmd方式.可视化工具,今天记第三种----node端连接数据库. 一:mysql模块介绍与下载 1.mysql模块是node端专门连接数据库的第三方模块 2.下载 ...

  6. Nodejs学习笔记(3) 创建服务器:Web 模块(http)与 express 框架

    目录 参考资料 1. 使用 http 模块创建服务器 1.1 实现思路及代码 1.2 HTTP 结构 1.2.1 Request中的重要字段 1.2.2 Response 头信息:文件类型.状态码.连 ...

  7. node框架express里面静态文件中间件express.static,根据路径名查找文件

    - 是express框架下的一个方法,可以根据请求路径名查找某个文件下文件名字和路径名相同的文件 - 3.X里面有20多个中间件,但是在4.X里面 只保留了express.static - 语法 ex ...

  8. 对于Node中Express框架的中间件概念的感知

    中间件是什么呢? 中间件就是客户端http请求发起传送到服务器和服务器返回响应之间的一些处理函数. 为什么要使用中间件? 通过中间件,可以对数据进行操作使得我们能方便地操作请求数据编写服务器响应.如b ...

  9. nodeJs学习-06 模块化、系统模块、自定义模块、express框架

    系统模块:http://nodejs.cn/api/events.html 自定义模块: require   请求:引入模块 module    模块:批量输出 exports   输出:单独输出   ...

随机推荐

  1. Python档案袋(生成器、迭代器、队列 )

    生成器: 简单的生成器实现: #生成器,将for循环的变量传递到前面的式子进行处理 #生成的并不是一个列表,而是一个存在算数规则的对象 #不能通过下标直接取值,必须一个一个从头到尾取 va=(i*2 ...

  2. 很详细的Django入门详解

    Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站!采用了MVC的框架模式,即模型M,视图V和控制器C,也可以称为MVT模式,模型M,视图V,模板T.在学 ...

  3. 前端笔记之ES678&Webpack&Babel(上)初识ES678&Babel&let和const&解构&语法

    一.ES版本简介和调试运行方法 1.1 ECMAScript简介 MDN手册:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript JavaS ...

  4. Python进阶:全面解读高级特性之切片!

    导读:切片系列文章连续写了三篇,本文是对它们做的汇总.为什么要把序列文章合并呢?在此说明一下,本文绝不是简单地将它们做了合并,主要是修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔 ...

  5. 使用 ASP.NET Core MVC 创建 Web API(五)

    使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 使用 ASP.NET Core MVC 创建 Web API(二) 使 ...

  6. 服务端预渲染之Nuxt(爬坑篇)

    Nuxt是解决SEO的比较常用的解决方案,随着Nuxt也有很多坑,每当突破一个小技术点的时候,都有很大的成就感,在这段时间里着实让我痛并快乐着.在这里根据个人学习情况,所踩过的坑做了一个汇总和总结. ...

  7. Android中一个经典理解误区的剖析

    今天,在Q群中有网友(@广州-包晴天)发出了网上的一个相对经典的问题,问题具体见下图. 本来是无意写此文的,但群里多个网友热情不好推却,于是,撰此文予以分析. 从这个问题的陈述中,我们发现,提问者明显 ...

  8. CSS入门知识汇总

    1.CSS认识 在谈论CSS的概念之前,我们先说一说web标准的目的——其在于创建一个统一的用于web表现层的技术标准,以便通过不同浏览器或终端设备向最终用户展示信息内容.一个网页的呈现是由三部分组成 ...

  9. U盘制作微pe工具箱(实战)

    分享人:广州华软 浩言 前言 相信大家平时生活中还是工作上使用电脑的时间还是比较多的,有时候电脑出现故障,比如系统文件损坏,没办法正常开机,或者是开机密码忘了,想要重装系统等,下面我推荐一个U盘启动项 ...

  10. DataPipeline | PayPal庞姬桦:大数据在小微企业贷款上的运用

    庞姬桦女士毕业于北京大学和美国哥伦比亚大学,目前担任PayPal公司消费者风险管理总监,负责通过大数据实现对互联网金融风险的侦测.跟踪.管控和防范.在加入PayPal之前,曾任职于渣打银行(中国)和美 ...