express
- 安装
- 配置
- 接收请求
- 响应
简单的服务器 08express1/server.js
const express = require('express');
var server = express();//创建服务
//请求根目录执行
server.use('/a.html',function(req,res){
res.send('aaa');
res.end();
});
server.use('/b.html',function(req,res){
res.send('bbb');
res.end();
});
server.listen(8080);//监听
req res 原来的方法还有。只是新增了一些东西,比如write,end
//send可以直接返回 json
server.use('/a.html',function(req,res){
res.send({a:1,b:2});
res.end();
});
小结
- 创建服务 var server = express();
- 处理请求 server.use(地址,function(req,res){})
- 监听 server.listen(8080);
3种接收用户请求的方法 08express1/server1.js
职匹配一个
- get请求: get('/',function(req,res){})
- post请求: post('/',function(req,res){})
- request: use('/',function(req,res){})
响应文件 08express1/server2.js
-
express-static:
npm install express-static
-
08express1/server2.js
const express = require('express'); const expressStatic = require('express-static'); var server = express(); server.listen(8080); //指定去哪儿读 静态文件 server.use(expressStatic('./www')); // localhost:8080/a.html
接口 08express1/server3.js
- /login?username=yuonly&pwd=123
-
返回: {"ok":true,"msg":"成功"}
-
获取参数 req.query
var users ={ 'yuonly':'123123', 'zhangsan':'666', 'lisi':'999' } server.get('/login',function(req,res){ //直接获取get参数的对象 var username = req.query['username']; var pwd = req.query['pwd']; if(users[username]==null){ res.send({ok:false,msg:'用户不存在'}); }else{ if(users[username]!=pwd){ res.send({ok:false,msg:'用户名密码错误'}); }else{ res.send({ok:true,msg:'登录成功'}); } } }) // http://localhost:8080/login?username=lisi&pwd=123
数据处理 09express2/server.js 09express2/form.html
1 get: req.query
2 post: req.body
安装 bodyparser
npm install body-parser
引入模块
const bodyParser = require('body-parser');
定义urlencoded中间件
server.use(bodyParser.urlencoded({}));
server.post('/',function(req,res){
从req.body中读取post数据
console.log(req.body);
})
小结
- get: 无需中间件 req.query
-
post: 需要 body-parser中间件
server.use(bodyParser.urlencoded({ extended:true,//启用扩展模式,意义不大 limit:2*1024//限制 默认100k })); req.body
中间件:使用、写、链式操作
链式操作 09express2/server1.js
server.use('/',function(req,res,next){
console.log('aaa');
next();
})
server.use('/',function(req,res,next){
console.log('bbb');
})
自己定义一个body-parser中间件的功能 09express2/server2.js
server.use(function(req,res,next){
var str = '';
req.on('data',function(data){
str += data;
})
req.on('end',function(){
//解析过后的数据,绑定到req.body身上
req.body = querystring.parse(str);
//next后,在下面匹配的中间件仍然可以接收到 req.body的数据
next();
})
})
server.use('/',function(req,res){
console.log(req.body);
})
封装自己的body-parser
1 09express2/lib/my-body-parser.js
const querystring = require('querystring');
module.exports = function(req,res,next){
var str = '';
req.on('data',function(data){
str += data;
})
req.on('end',function(){
req.body = querystring.parse(str);
next();
})
}
2 在 09express2/server3.js 中使用
const express = require('express');
const bodyParser2 = require('./libs/my-body-parser.js');
var server = express();
server.listen(8080);
server.use(bodyParser2);
server.use('/',function(req,res){
console.log(req.body);
})
3 使用 09express2/form.html 测试
session、cookie
-
cookie: 在浏览器保存一些数据,每次向服务器发起请求都会带过来
不安全、存储空间小(4K)
-
session: 保存在服务端,但session依赖cookie
更安全
cookie中会有一个sessionid的ID,服务器根据cookie带过来的sessionid找到服务器端与之对应的文件,进行读取或写入
cookie 10cookie-session/server.js
cnpm install express express-static cookie-parser cookie-session
- 读取-cookie-parser
- 发送 res.cookie('user','yuonly',{path:'/aaa',maxAge:30*24*3600*1000});
-
加密 10cookie-session/server2.js
req.secret = 'yuonly123123123'; res.cookie('user','yuonly',{signed:true});
读取及发送小例子 10cookie-session/server2.js
const express = require('express');
var server = express();
//cookie
const cookieparser = require('cookie-parser');
server.use(cookieparser());
server.use('/aaa/a.html',function(req,res){
//读取cookie 装完cookie-parser后有这个属性
console.log(req.cookies,'read');
//发送cookie
res.cookie('user','yuonly',{path:'/aaa',maxAge:30*24*3600*1000});
res.send('ok');
})
// http://localhost:8080/aaa/a.html
server.listen(8080);
小结
-
发送
res.sercet = 'sjksdjfkl123'; res.cookie(名字,值,{path:生效路径,maxAge:有效期,signed:是否需要签名})
-
读取cookie
cookie-parser service.use(cookieParser(签名)) service.use(function(req,res){ req.cookies; req.signedCookies; })
-
删除
res.clearCookie(key)
-
扩展--加密 cookie-encrypter
session 10cookie-session/server3.js
- cookie-session
1 读取
server.use(cookiesession({
//session要有效,必须设置keys。
keys:['111','2222','3333','4444','555']
}));
if(req.session['count']==null){
req.session['count'] = 1;
}else{
req.session['count']++;
}
console.log(req.session['count']);
res.send('ok');
res.end();
2 写入
req.session['count'] = 1;
模板引擎
- jade-破坏式、侵入式、强依赖
- ejs-非侵入式的,不破坏原有的html、css
ejs
-
安装
cnpm install ejs
1 11ejs/1.js
const ejs = require('ejs');
// 模板 数据
ejs.renderFile('./view/1.ejs',{name:'yuonly'},function(err,data){
console.log(data);
});
2 11ejs/view/1.ejs
<div>
<%= name %>
</div>
ejs 循环数据
1 11ejs/2.js
const ejs = require('ejs');
ejs.renderFile('./view/2.ejs',{json:{arr:[{username:'yuonly'},{username:'xiaowang'}]}},function(err,data){
console.log(data);
});
2 11ejs/view/2.ejs
<% for(var i=0;i<json.arr.length;i++){ %>
<div>
<%= json.arr[i].username %>
</div>
<% } %>
ejs中非转义输出 <%- %>
1 11ejs/view/3.ejs
<% var str = '<div></div>'; %>
// html实体
<%= str %>
// html标签本身
<%- str %>
express整合到一起 012expressall
- 主体
- cookie、session
- 数据
- 模板引擎
1 安装相关包
cnpm install express express-static cookie-parser cookie-session body-parser ejs --save
2 目录说明
- libs:第三方模块
- views:模板
- www:网站根目录
- server.js: express服务器
bodyparser弊端,只能解析post数据,不能处理post上来的文件
文件上传测试 12expressall/server_file.js post.html
1 body-parser
只能获取上传文件的文件名.form表单 加上 enctype之后,干脆没东西了。
server_file.js
const express = require('express');
const bodyParser = require('body-parser');
var server = express();
server.use(bodyParser.urlencoded({extended:false}));
server.post('/',function(req,res){
console.log(req.body);
})
server.listen(8080);
post.html
<form action="http://localhost:8080" method="post" enctype="multipart/form-data">
文件: <input type="file" name="username" id=""> <br>
<input type="submit" value="上传">
</form>
2 multer 用来处理文件上传 12expressall/server_multer.js
//1 安装
cnpm install multer --save
//2 导入
var multer = require('multer');
//3 创建multer对象
var objMulter = multer({dest:'./www/upload/'});
//4 使用对应方法,any 上传多文件
server.use(objMulter.single('f1'));
server.post('/',function(req,res){
//5 获取上传文件
console.log(req.files);
// [ { fieldname: 'username',
// originalname: '屏幕快照 2017-05-30 上午8.12.11.png',
// encoding: '7bit',
// mimetype: 'image/png',
// buffer: <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 01 10 00 00 01 94 08 06 00 00 00 fd 2b 7d db 00 00 01 5e 69 43 43 50 49 43 43 20 50 72 6f 66 69 ... >,
// size: 160018 } ]
})
3 发现上传后的文件没有扩展名,所以需要用fs模块对该文件进行重命名 12expressall/rename.js a.txt
4 如果要对上传文件重命名,还需要知道原来文件的路径等信息,使用path。12expresssall/path.js
文件上传小结
- body-parser :用来解析post数据
-
multer:用来解析文件的数据 enctype="multipart/form-data"
//1 multerObj var obj = multer({dest:'upload'}); //2 设定上传方法 server.use(obj.any()); //3 使用 server.use('/',function(req,res,next){ <!-- req.files --> //4.新的文件名 var pathObj = pathLib.parse(req.files[0].originalname); var newName = req.files[0].path + pathObj.ext; //5.重命名 req.files[0].path fs.rename(req.files[0].path,newName,function(err){ if(err){ res.send('上传失败'); }else{ res.send('成功'); } }) })
consolidate-适配各种模板引擎
cnpm install consolidate --save
配置模板引擎
-
输出什么东西
server.set('view engine','html');
-
模板文件放在哪儿了
server.set('views','./views');
-
我要用哪种模板引擎
server.engine('html',consolidate.ejs);
路由 13express_consolidate/server_route.js
相当于子服务器 server
//1.创建router
var routeUser = express.Router();
//2.把router添加到server
server.use('/user',routeUser);
//3.router内部的路由的定义
routeUser.get('/1.html',function(req,res){
res.send('user1');
})
routeUser.get('/2.html',function(req,res){
res.send('user222');
})
//localhost:8080/user/1.html
//localhost:8080/user/2.html
mysql 14mysql
- 关系型: mysql、oracle
- 非关系型-文件型: mongo
Server端:存数据 Client端:管理工具、Node
Server安装 官网下载安装
基本概念
1 库:文件夹
2 表:excel文件
行: 一条数据
列:(字段、域) 一个数据项
客户端安装
cnpm i mysql --save
使用nodejs 链接mysql
const mysql = require('mysql');
//1.链接数据库
// mysql.createConnection(哪台服务器,用户名,密码,库名);
var db = mysql.createConnection({
host:'localhost',
user:'root',
password:'root',
database:'jy1608_blog',
port:8889
});
//2.查询
db.query("SELECT * FROM `user`;",function(err,data){
if(err){
console.log(err);
}else{
console.log(data,'data');
}
})