http协议、模块、express框架以及路由器、中间件和mysql模块
一、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 //获取路由传递数据,返回对象
});
浏览器中请求并传递
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模块的更多相关文章
- express框架安装及中间件原理
本文主要介绍express中间件的原理,来应对面试. 1.安装express及初始化: npm install express-generator -g => express expre ...
- 原生http模块与使用express框架对比
node的http创建服务与利用Express框架有何不同 原生http模块与使用express框架对比: const http = require("http"); let se ...
- 1 ~ express ~ 初始化。安装第三方模块express。中间件
一,初始化 二,安装第三方模块express 三,安装中间件 1,bodyParser : 解析 post 请求数据 2,cookies : 读写 cookie 3,swig :模板解析引擎 4,mo ...
- Node.js Express 框架学习
转载:http://JavaScript.ruanyifeng.com/nodejs/express.html#toc0 感觉很牛的样子,不过觉得对初学者没太大用,里面很多例子用的api都没有详细的说 ...
- 使用node中mysql模块连接本地数据库
连接数据库的方法迄今为止学了三种: cmd方式.可视化工具,今天记第三种----node端连接数据库. 一:mysql模块介绍与下载 1.mysql模块是node端专门连接数据库的第三方模块 2.下载 ...
- Nodejs学习笔记(3) 创建服务器:Web 模块(http)与 express 框架
目录 参考资料 1. 使用 http 模块创建服务器 1.1 实现思路及代码 1.2 HTTP 结构 1.2.1 Request中的重要字段 1.2.2 Response 头信息:文件类型.状态码.连 ...
- node框架express里面静态文件中间件express.static,根据路径名查找文件
- 是express框架下的一个方法,可以根据请求路径名查找某个文件下文件名字和路径名相同的文件 - 3.X里面有20多个中间件,但是在4.X里面 只保留了express.static - 语法 ex ...
- 对于Node中Express框架的中间件概念的感知
中间件是什么呢? 中间件就是客户端http请求发起传送到服务器和服务器返回响应之间的一些处理函数. 为什么要使用中间件? 通过中间件,可以对数据进行操作使得我们能方便地操作请求数据编写服务器响应.如b ...
- nodeJs学习-06 模块化、系统模块、自定义模块、express框架
系统模块:http://nodejs.cn/api/events.html 自定义模块: require 请求:引入模块 module 模块:批量输出 exports 输出:单独输出 ...
随机推荐
- Python-字符版gif图
一.背景 上一篇文章我们讲了怎么做自己的炫酷二维码,需要的移驾Python-炫酷二维码,本片文章我们讲述下怎么把一张图片处理成字符版图片,就是说使用字符替代每个像素的颜色,形成一个由字符组成的图片,并 ...
- React + TypeScript:元素引用的传递
React 中需要操作元素时,可通过 findDOMNode() 或通过 createRef() 创建对元素的引用来实现.前者官方不推荐,所以这里讨论后者及其与 TypeScript 结合时如何工作. ...
- [译]PEP 380--子生成器的语法
导语: PEP(Python增强提案)几乎是 Python 社区中最重要的文档,它们提供了公告信息.指导流程.新功能的设计及使用说明等内容.对于学习者来说,PEP 是非常值得一读的第一手材料,学习中遇 ...
- Java虚拟机一:运行时数据区域
java虚拟机在执行java程序的过程中,会把内存划分为若干个不同的数据区域.每个区域都有各自的用途,创建和销毁时间,按照<java虚拟机规范(Java SE 7 版)>的规定,虚拟机运行 ...
- ArcGIS API for JavaScript 4.x 本地部署之IIS法
[导读] 关于如何在默认网站(Default Web Site,物理地址C:\inetpub\wwwroot\)启动,已有很多博客详尽地写好了. 本篇在自建网站(本机)中配置http而非https的j ...
- Android App渗透测试工具drozer,Qark,Androguard
一. drozer简介 drozer(以前称为Mercury)是一款Android安全测试框架. drozer允许您通过承担应用程序的角色并与Dalvik VM,其他应用程序的IPC端点和底层操作系统 ...
- C# Npoi 实现Excel与数据库相互导入
十年河东,十年河西,莫欺少年穷! NPOI支持对 Word 和 Excel 文件的操作! 针对 Word 的操作一般用于打印技术!说白了就是利用 Word 文件作为模板,生成各种不同的打印!具体用到的 ...
- 如何让 Editplus 支持 SQL 语法高亮
editplus 用来编辑或查看一些常用程序源码都很方便,而且软件小巧,但是他原生不能支持对 SQL 文件的高亮显示,有点遗憾,但好在我们可以自定义这种高亮显示,那么要如何设置呢 1. 首先点击下载文 ...
- Quartz实现分布式可动态配置的定时任务
关键词: 1. 定时任务 2. 分布式 3. 可动态配置触发时间 一般通过Quartz实现定时任务很简单.如果实现分布式定时任务需要结合分布式框架选择master节点触发也可以实现.但我们有个实际需求 ...
- C# 三种打印方式含代码
一:C#代码直接打印pdf文件(打印质保书pdf文件) 引用: 代码注释很详细了. private void btn_pdf_Click(object sender, RoutedEventArgs ...