4. express 框架
express是基于nodejs的快速、开发、极简的web开发框架 (www.express.com.cn)
安装 npm install express
const express=require('express'); //引入express框架 var server=express(); //创建web服务器 server.listen(8080); //设置端口 |
(1)路由
浏览器向web服务器发送请求,web服务器根据请求的方法和请求的URL来做出响应。
三要素:请求方法、请求的URL、响应(回调函数)
响应的对象(res)
res.send() 响应内容,只能响应一次
res.sendFile() 响应文件,必须使用绝对路径(__dirname) res.sendFile(__dirname+'/list.html');
res.redirect() 响应重定向,直接跟重定向url
//get 请求的方法 //参数1:请求的url 参数2:响应(回调函数) server.get('/index',function(req,res){ //req:请求的对象 res:响应的对象 res.send('this is my homepage 首页'); }); | //练习:创建路由,请求方法为get,请求url为/login。响应‘请登陆’ server.get('/login',function(req,res){ res.send('请登陆XXXXXXXXX'); // res.send('welcome'); send调用以后响应已经结束,不运行再次响应 }) |
请求的对象(req)
req.method 请求的方法
req.url 请求的url
req.header 请求的头信息
req.query 获取请求时查询字符串传递的数据,并格式化为对象
(2)post和get传递数据
post请求是通过表单提交传递数据,服务器端通过事件的形式获取数据
get请求以查询字符串的形式传递数据,服务器端使用req.query获取数据,结果是对象
查询字符串传递数据容易被浏览器所缓存,而post传递数据不会出现在地址栏
<form method="post" action="/postlogin"> server.post('/postlogin',function(req,res){ req.on('data',function(buf){ var str=buf.toString(); var obj=querystring.parse(str); console.log(obj); });res.send('登陆成功'); }); | <form method="get" action="/getlogin"> server.get('/getlogin',function(req,res){ console.log(req.query); res.send('注册成功!!!'); }); |
req.on('data',function(buf){ buf 就是获取的数据,格式为buffer,转为字符串后格式化为查询字符串,需要借助查询字符串模块格式化为对象 }) | req.on('data',function(buf){ //buffer转为查询字符串 var str=buf.toString(); //查询字符串格式化为对象 var obj=querystring.parse(str); console.log(obj); |
(3)使用路由传递参数——路由传参
设置路由中接收的名称
server.get('/detail/:lid',function(req,res){ req.params //获取路由传参的数据,格式化为对象 }) |
浏览器传递 127.0.0.1:8080/detail/5 5是传递的数据,被lid接收
(4)路由器
路由的使用过程中,不同的模块可能出现相同的URL,把同一个模块下的路由放到一个容器,这个容器就是路由器。路由器最终要引入到web服务器下才能使用
1.创建路由器模块(自定义)
const express=require('express'); var router=express.Router(); //创建路由器对象 router.get('/list',function(req,res){...}); /添加路由 module.exports=router; //导出路由器对象 |
2.在web服务器下使用路由器
const productRouter=require('./product.js'); //引入路由器对象 server.use('/product',productRouter); //把路由器挂载到 /product 下 访问形式 /product/list |
练习:路由器使用 |
|
|
router.js | product.js | user.js |
//引入express框架 const express=require('express'); //引入商品路由器 const productRouter=require('./product.js'); //引入用户路由器 const userRouter=require('./user.js'); //创建服务器 var server=express();//设置端口 server.listen(8080); //商品模块下的路由 //使用商品路由器 挂载 --> /product/list //参数1:挂载的位置 参数2:要使用的路由器 server.use('/product',productRouter); //用户模块下的路由 //使用用户路由器 server.use('/user',userRouter); | //引入express const express=require('express'); //创建空的路由器,返回对象 var prouter=express.Router(); //往路由器中添加路由 prouter.get('/list',function(req,res){ res.send('这是商品模块下的列表*******嘻嘻嘻'); }); //导出路由器对象 module.exports=prouter; | //练习:创建用户模块路由(user.js)添加路由用户列表(/list get),在web服务器下引入并使用,挂载到/user下 //引入express const express=require('express'); //创建空路由器,返回对象 var urouter=express.Router(); //往路由器中添加路由 urouter.get('/list',function(req,res){ res.send('这是用户列表*****嘎嘎嘎****'); }); //导出路由器对象 module.exports=urouter; |
(5)中间件
中间件作用是为主要的业务逻辑(路由)服务,可以理解为一个过滤器
分类:应用级中间件、路由级中间件、内置中间件、第三方中间间、错误处理中间件
1.应用级中间件(自定义中间件)
每一个中间件都是一个函数,需要配合其它的中间件或者路由使用
server.use(path,function(req,res,next){.....}) //过滤路由中url为path的路由 server.use(function(req,res,next){.....}) // 过滤路由中所有的路由 | use() 参数1:给哪一个url的路由使用(如果参数1为空,标识会给所有的路由使用) 参数2:中间件函数(回调)可以获取请求以及做出响应 参数3:next() 会执行下一个中间件或者路由 |
2.路由级中间件
路由器的使用
server.use(path,路由器); //path 挂载的url ,在path下使用路由器 |
3.内置中间件
在express4中只保留了一个内置中间件(static)
server.use(express.static('目录')) |
//把静态资源托管到指定目录,如果浏览器请求静态资源,自动到该目录下查找
静态资源:html、css、浏览器js、图像、视频....
4.第三方中间件
npm install 中间件名称
使用中间件
const bodyParser=require('body-parser'); server.use(bodyParser.urlencoded({ extend:false })); 路由中获取post请求数据(server.post(...)) req.body 格式化为对象 | 前提:引入body-parser模块 urlencoded:将post请求的数据格式化为对象 extended:不用第三方qs模块,而是使用核心模块querystring将查询字符串格式化为对象 |
5.mysql模块
连接 mysql.exe -h127.0.0.1 -P3306 -uroot -ptoot 简写:mysql -uroot
增 INSERT INTO emp VALUES( ......)
删 DELETE FROM emp WHERE uid=5;
改 UPDATE emp SET .......WHERE ....
查 SELECT * FROM emp;
(1)连接mysql
const mysql=require('mysql'); //引入mysql模块 var connection=mysql.createConnection({ ....});//创建连接对象,传递连接数据库需要的服务器、端口、用户名、密码、使用的数据库 connection.connect(); //建立连接 connection.qyery(sql,callback); sql:要执行的SQL语句;callback回调函数,用于获取执行SQL的结果 function(err.result){} connection.end(); //执行完所有的SQL语句后关闭连接 |
(2)连接池
const mysql=require('mysql'); //引入mysql模块 var pool=mysql.createPool({ ... }) //创建连接池对象,传递服务器地址,端口,用户名,密码,要使用的数据库,连接池大小connectionLimit 默认是15 pool.query(sql,callbacl); //执行SQL语句,sql是要执行的SQL语句,callback回调函数。用于获取结果 |
占位符 ?
var did=1; var dname='保卫部'; // 占位符 ? 防止SQL注入攻击数据库 pool.query('INSERT INTO dept VALUES(?,?)',[did,dname],function(err,result){ .. } |