# express
cnpm i express --save
# 内容渲染
大多数情况下,渲染内容用res.render(),将会根据views中的模板文件进行渲染。
如果想写一个快速测试页,可以使用res.send()。这个函数将根据内容,自动帮设置Content-Type头部和200状态码。
# GET POST
GET请求的参数在URL中,在原生Node中,需要使用url模块来识别参数字符串。在Express中,不需要使用url模块了。可以直接使用req.query对象。
POST请求在express中不能直接获得,可以使用body-parser模块。使用后,将可以用req.body得到参数。但是如果表单中含有文件上传,那么还是需要使用formidable模块。
//也可以使用这种方式将req.body上挂载post数据
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
# 静态文件伺服能力
app.use(express.static("./public"));
可以直接访问public里的页面,为了怕干扰到其他的动态路由,可以加一个参数在前面,用来区分
# 模板引擎ejs
创建一个views目录,专门存储模板文件
cnpm i ejs --save
app.set("view engine","ejs");
app.get("/",function(req,res){
res.render("haha",{
"news" : ["我是小新闻啊","我也是啊","哈哈哈哈"]
});
});
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<ul>
<% for(let i=0;i<news.length;i++){%>
<li><%= news[i] %></li>
<%}%>
</ul>
</body>
</html>
TIP
修改默认存放文件夹,
想要变成/websong
app.set('views','webosg');
app.set('view enging','ejs');
# 第一个express
var express =require("express")
var app = express();
app.get("/",function(req,res){
res.send("你好");
})
app.get("/haha",function(req,res){
res.send("这是haha页面,哈哈哈哈哈哈");
});
app.get(/^\/student\/([\d]{10})$/,function(req,res){
res.send("学生信息,学号" + req.params[0]);
});
app.get("/teacher/:gonghao",function(req,res){
res.send("老师信息,工号" + req.params.gonghao);
});
app.listen(3000,()=>{
console.log("server is ok")
});
# express中get和post参数
原生node获取参数方式
- get
var http=require("http") var url =require("url") http.createServer((req,res)=>{ var obj =url.parse(req.url,true) var query=obj.query })const http = require("http") const querystring = require("querystring") const url =require("url") http.createServer((req,res)=>{ if(req.method.toLocaleLowerCase()==="get"){ let mes=url.parse(req.url,true) let mes1=JSON.stringify(mes.query) res.write(`1${mes1}`) let mes2=JSON.stringify(querystring.decode(req.url.split('?')[1]) ) res.write(`2${mes2}`) } res.end("ok") }).listen(3000,()=>{ console.log(`server is bulid`) })url.parse();方法可以将一个完整的URL地址,分为很多部分,常用的有:host、port、pathname、path、query。第一个参数是地址,第二个参数默认是false,设置为ture后,其query属性就会从查询字符串格式(“a=1&b=2”)转换为了对象格式({a: 1,b: 2})。
- post
要想获得post参数对象,需要用到第三方包querystring
var http=require("http") var fs= require("fs") var querystring =require("querystring") http.createServer(function(req,res){ console.log(req.url) if(req.url=="/"){ fs.readFile("./test1.html",function(err,data){ if(err){ throw err } res.end(data) }) } if(req.url==="/post"&&req.method.toLowerCase()=="post"){ var data = ''; req.on('data', function (chunk) { // chunk 默认是一个二进制数据,和 data 拼接会自动 toString data += chunk; }); req.on('end', function () { var dataObject = querystring.parse(data); res.write(data) res.write("-------") res.end(JSON.stringify(dataObject)) }); } }).listen(3000,()=>{ console.log("server is ok") })<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <title></title> </head> <body> <form action="/post" method="post"> name:<input type="text" name="name"><br/> sex:<input type="text" name="sex"><br/> <input type="submit"> </form> </body> </html>name=3333&sex=4444-------{"name":"3333","sex":"4444"}<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <button onclick="fun()">kaishi</button> </body> </html> <script type="text/javascript"> var data= { type: 'post', name: 'post发送json参数' } function fun(){ var xhr = new XMLHttpRequest(); xhr.open('post', 'http://localhost:3000/post', true); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.send(JSON.stringify(data)); xhr.onload = function () { if (xhr.status === 200) { var text = xhr.responseText; document.write(text) } else { } }; } </script>{"type":"post","name":"post发送json参数"} ------- {"{\"type\":\"post\",\"name\":\"post发送json参数\"}":""}express中的get和post
- get
- 以问号连接在地址栏里
var express = require("express"); var app = express(); app.get("/",function(req,res){ console.log(req.query) res.end(JSON.stringify(req.query)) }) app.listen(3000); //http://localhost:3000/?ID=19&NAME=23 //{"ID":"19","NAME":"23"}- 在前端异步调用接口传参数用
var express = require("express"); var app = express(); app.get("/:id/:name",function(req,res){ console.log(req.query) console.log(req.params) res.end(JSON.stringify(req.params)) }) app.listen(3000); //http://localhost:3000/18/zhangsan //{"id":"18","name":"zhangsan"}- post 引入body-parser
//配置 var bodyParser = require("body-parser"); app.use(bodyParser.urlencoded({ extended: false })) app.use(bodyParser.json()) //使用 req.body;var express = require("express"); var app = express(); let fs= require("fs") var bodyParser = require("body-parser"); app.use(bodyParser.urlencoded({ extended: false })) app.use(bodyParser.json()) app.get("/",function(req,res){ fs.readFile("./test1.html",function(err,data){ if(err){ throw err } res.end(data) }) }) app.post("/post",function(req,res){ console.log(req.body) res.end(JSON.stringify(req.body)) //{"type":"post","name":"post发送json参数"} //对上面的一个表单提交的一个用ajax的application/json提交的均可以成功转化格式 }) app.listen(3000);
# express路由中的next
next参数加上使用后,如果经过判断不是本路由需要使用的内容,就会继续往下走,给下个路由判断
var express = require("express");
var app = express();
var a = 100;
app.get("/:username/:id",function(req,res,next){
var username = req.params.username;
//检索数据库,如果username不存在,那么next()
if(username!=="admin"){
console.log("1");
res.send("用户信息");
}else{
next();
}
});
app.get("/admin/login",function(req,res){
console.log("2");
res.send("管理员登录");
});
app.listen(3000);
//http://localhost:3000/admin/login
//管理员登录
------
//http://localhost:3000/adm2in/login
//用户信息
# express中的app.use
app.use()也是一个中间件。与get、post不同的是,他的网址不是精确匹配的。而是能够有小文件夹拓展的。
var express = require("express");
var app = express();
var a = 100;
app.use("/admin",function(req,res){
res.write(req.originalUrl + "\n");
res.write(req.baseUrl + "\n");
res.write(req.path + "\n");
res.end("ok");
});
app.listen(3000);
//http://localhost:3000/admin/12/33?id=123&name=99
// /admin/12/33?id=123&name=99
// /admin
// /12/33
// ok
TIP
不写路径的时候,实际上就相当于"/",就是所有网址
//应用
var express = require("express");
var fs = require("fs");
var app = express();
//当你不写路径的时候,实际上就相当于"/",就是所有网址
app.use(haha);
app.get("/admin",function(req,res){
res.send("管理员");
})
app.listen(3000);
function haha(req,res,next){
var filePath = req.originalUrl;
//根据当前的网址,读取public文件夹中的文件
//如果有这个文件,那么渲染这个文件
//如果没有这个文件,那么next();
fs.readFile("./public/" + filePath,function(err,data){
if(err){
//文件不存在
next();
return;
}
res.send(data.toString());
});
}
# cookie session
Express中,使用cookie-parser中间件来设置cookie。 主要设置选项:domain、path、maxAge、signed
session 会话,专门用于实现“登陆”,表示某一次用户的访问。
会话是特殊的cookie。用户在登陆之后,服务器往客户端的cookie中发送一个字符串,但是此字符串是经过服务器加密的,服务器会缓存cookie文本和用户的信息;再次访问之后,如果这个加密字符串与服务器的缓存匹配,那么则判断这是同一个用户回来了,那么将保持登陆状态。
express中,使用express-session中间件,来使用session。
任何语言中,session的使用,是“机理透明”的。他是帮你设置cookie的,但是足够方便,让你感觉不到这事儿和cookie有关。
var express = require("express");
var app = express();
var session = require("express-session");
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true
}));
app.get("/",function(req,res){
if(req.session.login == "1"){
res.send("欢迎" + req.session.username);
}else{
res.send("没有成功登陆");
}
});
app.get("/login",function(req,res){
req.session.login = "1"; //设置这个session
req.session.username = "考拉";
res.send("你已经成功登陆");
});
app.listen(3000);