ejs 的使用
var http = require('http");
var ejs = require("ejs");
var fs = require('fs');
var server = http.createServer(function(req,res){
fs.readFile('./views/index.ejs',function(err,data){
//創(chuàng)建模版 html 文件,就是 data
var indexString = data.toString();
//設置數(shù)據(jù)
var dataDict ={a:6};
// 使用數(shù)據(jù)渲染
var html = ejs.render(indexString);
res.writeHead(200,{'Content-Type':'text/html;charset=UTF8'});
res.end(html);
})
})
server.listen(3000,"127.0.0.1");
express 框架
- express 是一個包身冬,是封裝了 node.js 一些功能的包衅胀,類似jQuery
- 在使用之前要用
npm install express --save
安裝
var express = require('express');
//創(chuàng)建 express 的 app 對象(可以理解為創(chuàng)建服務器)
var app = express();
//接收路由,處理請求
app.get('/',function(req,res){
//send 可以理解成 end,但是注意 send 在后續(xù)版本中默認設置的有對應的響應頭酥筝,一般表示成功的設置
res.send('success');
})
//監(jiān)聽的時候可以不設置對應的服務器了滚躯,express 內(nèi)部自己設置了,只設置端口號即可
app.listen(3000);
express 處理參數(shù)
- 處理一個路由,以
/teacher
開頭嘿歌,后面拼接對應的 teacher 的 id 號掸掏,我們獲取對應 id 當成參數(shù) express 默認不處理?
以及#
,使用:
來處理參數(shù) - 我們可以通過
params
來獲取對應的參數(shù)宙帝,req.params['id']
- 只要是
:
我們都可以作為參數(shù)來處理阅束,然后根據(jù)對應的 params 來獲取對應的參數(shù)
var express = require('express');
var app = express();
app.get('./:username/:password',function(req,res){
res.write(req.params.username);
res.send(req.params.password);
});
app.listen(3000);
express 處理靜態(tài)資源
- 使用原生的 node 處理靜態(tài)路徑的時候, 我們需要進行判斷
- 但是使用 express 處理靜態(tài)路由茄唐,非常方便
var express = require('express');
var app = express();
//我們值需要通過設置對應的需要使用的靜態(tài)路由的文件就可以
//就是給對應的需要使用靜態(tài)資源的文件夾設置靜態(tài)路徑
//use: 表示只要后面設置的路徑可以匹配到息裸,無論是 post 還是別的請求都可以
app.use(express.static('./public'));
app.get('/haha/',function(req,res){
res.send('haha')
});
app.listen(3000);
render 的使用
var express = require('express');
var app = express():
//在渲染之前我們需要設置用哪個文件蝇更,哪個模版
app.set('view engine','ejs');
//接受請求,渲染界面
app.get('/',function(req,res){
//渲染頁面一般使用 res
//res.end 就是表示當對應的響應完成后呼盆,返回給對應的頁面的數(shù)據(jù)年扩,一般情況下返回的是字符串或者 buffer
//res.send: 和 end 一樣,只是 send 默認多了 響應頭的設置
//res.render 第一個參數(shù)表示渲染的模版頁面访圃,值需要設置對應的文件就可以厨幻,不需要管理路徑
//就是說只能去對應的路徑下找對應的模版文件,其他的文件不能渲染,第二個參數(shù)是傳的值
res.render('index',{a:6})腿时;
});
app.listen(3000);
- 在 express 中路由設置的時候是不區(qū)分大小寫的
app.get('/AAa',function(req,res){})
用 render 渲染模版况脆,再用 post 請求發(fā)出參數(shù),接收
var express = require('express');
var app = express();
//使用 ejs 渲染模版
//我們并沒有引入 ejs 這個包
//當我們使用模版進行渲染的時候批糟,可以導入模版格了,系統(tǒng)會自動去對應 node_modules 文件中的對應的包
//只要這個包存在就可以了
app.set('view engine','ejs');
app.get('/',function(req,res){
//使用 render渲染
res.render('form');
});
//處理 post 請求
app.post('/',function(req,res){
res.send('success ---post')
});
app.listen(3000);
- 原生建立的服務器中的代碼,每次接收到請求就會執(zhí)行一次
var http = require('http');
/*var a = 100,只是在程序運行起來后,調(diào)用一次*/
var a = 100;
//
var server = http.createServer(function (req,res) {
//這個括號中的代碼,只要接受到請求就會調(diào)用,所以每次刷新一次a會變化
a ++;
res.end(a.toString());
})
server.listen(3000,'127.0.0.1');
- express 包也是如此
var express = require('express');
var app = express();
//在express中,這個代碼也是調(diào)用一次
var a = 100;
//get請求徽鼎,只要接受到請求就會調(diào)用
app.get('/',function (req,res) {
a++;
res.send(a.toString());
})
app.listen(3000);
路由沖突
var express = require('express');
var app = express();
//當我們使用 express 的時候盛末,會發(fā)現(xiàn)如果我們請求的路由相似,那么第一個接收到的路由可以匹配否淤,其他的不會被匹配
app.get('/',function(req,res){
console.log(1);
});
app.get('/',function(req,res){
console.log(2);
});
app.listen(3000);
//打印1
路由的解析過程
var express = require('express');
var app = express();
//路由解析的時候悄但,是從上到下的,就像水流一樣
//所以當匹配到第一個的時候石抡,就會停止匹配
//所以下面這種情況下檐嚣,即使輸出的 url 是 admin 也會答應用戶信息
//處理方法,就是如果想要獲取后面的匹配就將后面的代碼拿到前面
//這種處理方法非常不好啰扛,如果界面很多就很難處理
//所以需要借助一個 next 方法嚎京,讓對應的解析可以繼續(xù)
//但是這個 next 方法屬于回調(diào)函數(shù),應該在形參中定義
app.get('/:username/:password',function(req,res,next){
res.send('用戶信息')侠讯;
//這么做的原因就是,程序中暑刃,一般只能有一個 send 和 對應 end 一樣
// 當我們請求后厢漩,會根據(jù)參數(shù),檢索數(shù)據(jù)庫岩臣,如果有數(shù)據(jù)設置就設置數(shù)據(jù)溜嗜,設置 send 如果沒有就執(zhí)行 next() 使用下一個匹配
if(有對應的匹配){
//設置數(shù)據(jù)
//設置 send
}else{
next():
};
});
app.get('./admin/12345',function(req,res,next){
// send如果完成后,不能設置響應頭架谎,所以一樣不能設置兩次 send
res.send('管理信息')炸宵;
});
app.listen(3000);
中間件谷扣,在 node 中就是路由的處理