http子產品
http子產品是node重要的核心子產品之一。 Node中http子產品詳解(服務端篇)

node官方中文文檔:http://nodejs.cn/api/
先來看看最原生node寫服務,簡單的結構 webserver
// 1.引用http子產品
var http=require("http");
// 2.建立webserver req:請求---發送 res:相應----接收
http.createServer((req,res)=>{
// 4.響應文檔頭 ---- 設定目前内容的字元編碼和 相應的狀态碼
res.writeHead(200,{"content-type":"text/html;charset=utf-8"})
// 5.傳回資料
res.end("ok")
}).listen(3000) // 3.監聽端口
4.1、路由
通過URL路徑來區分不同的請求,進而找到不同的功能子產品來進行執行。
通俗點的話,路由就是根據不同的請求,找到不同的代碼完成處理。
我說:原生nodejs的路由分發,據我所見過的,挺麻煩的,性能也差。不過後期學到了express,以中間件的方式分發不同的路由,寫起來感覺就舒服很多。
4.2、URL子產品
對目前的url進行相關操作。
文法:
url.parse(req.url,true);
意為得到請求的url資料,第二個參數為true的話,就可以把目前url中的query頁面資料轉換成對象友善使用。
4.3、路由練習
兩個頁面登陸和注冊 ,通過點選送出按鈕, 背景根據url來調用不同的功能顯示。
登入/注冊頁面布局:
<form action="http://127.0.0.1:3000/login" >
<input type="text" placeholder="登入使用者名" name="username">
<input type="password" placeholder="登入密碼" name="userpass">
<button>登入</button>
</form>
node背景服務檔案:
var http=require('http');
var url=require('url');
http.createServer((req,res)=>{
res.writeHead(200,{"content-type":"text/html;charset=utf-8"})
// 進行路由判斷
var userUrl=url.parse(req.url,true)//通過url子產品的parse方法可以将請求參數對象化,然後可以通過res.end傳回前台
if(userUrl.pathname=="/favicon.ico") return;//這個小圖示node自行請求的,屏蔽掉
// console.log(userUrl);//是一個Url對象,裡一個屬性query存放自動轉化過來的的請求參數
if(userUrl.pathname=="/login"){
res.end("恭喜 "+userUrl.query.username+" 登入成功");
return;
}
if(userUrl.pathname=="/register"){
res.end("注冊成功 您的賬号是:"+userUrl.query.username);
return;
}
res.end("伺服器僅連接配接成功,沒有做任何操作");
}).listen(3000,()=>console.log("success"))
來看看請求結果:
express
express 第三方的架構 基于nodejs極簡web架構 地位非常
先來看看最簡單最基本的用法:
server.js
demoRou.js
Express官方網站 API接口文檔:https://www.expressjs.com.cn/4x/api.html
5.1、什麼是Express
express 是一個簡潔而靈活的 node.js Web 應用架構, 提供了一系列強大的特性和豐富的 HTTP 工具。
功能:擴充了web所需要的基本功能,豐富了HTTP工具,可以快速搭建一個網站。
5.2、Express—安裝
npm install --save express
5.3、Express—建立api接口
可以在該項目伺服器檔案目錄下建立一個server.js檔案 。
var express=require("express");
var app=express();
app.get("/user/login",function(req,res){
res.send({msg:"ok"})
})
app.get("/ser/home",function(req,res){
res.send({msg:"ok"})
})
var server=app.listen(3000)
解釋:
- app.get() 接受get請求;
- app.post() 接受post請求;
- app.all() 方法讓路由函數接收所有指定URL的HTTP方法。
路徑中使用
*
通配符可以比對所有,如:
app.get("/a*",function(req,res){}
比對以a開頭的所有url 。
5.4、Express—中間件
中間件:是每次接收到請求都會被先調用的函數,算是一個場所,給一些特定功能添加提供的。中間件中可以執行任何代碼,比如更改請求和響應對象,結束請求響應周期等。中間件可以一次性放入多個回調函數,但有執行順序,放在前面的先執行。中間件算是用戶端對伺服器請求的攔截器。
文法:
app.use([path,] callback [,callback ...])
将指定的一個或多個中間件函數安裝在指定的路徑上:當所請求路徑的基數比對時,将執行中間件函數。
官網: https://www.expressjs.com.cn/4x/api.html#app.use
// path預設值為“ /”,是以将為對應用程式的每個請求,執行不帶路徑安裝的中間件。
app.use(function(req,res,next){
next() // 向後執行,跳轉到下一個中間件
})
也可以把回調函數寫在外面,或者子產品化引入,然後通過app.usr(callback-name) 來應用中間件。
總之我了解的是,中間件就是一個任意的函數,然後可以通過app.use來應用這部分函數。
比如說我們自己做一個簡單例子 ,自己做一個中間件:
然後導入我們暴露的中間件子產品:
var myselfMW=require('./myself-middleware')
然後用
app.use(中間件)
在中間件中調用我們寫的子產品函數:由于在中間件的最後一位,是以最後執行。
擴充:
路由中間件比如 body-parser ,在給post傳輸資料時使用。
安裝方式:如果用yarn安裝的話,
yarn add body-parser
5.5、Express—路由
路由是根據url,決定了哪部分去響應用戶端請求。
在HTTP請求中,可以通過路由提取出請求的URL以及GET/POST參數。
5.6、Express—路由建立
建立router檔案夾,然後建立路由檔案命名為userRouter.js 。
// 存放路由的檔案
var express=require("express");
var router=express.Router()
// 設定路由
router.get("/login",function(req,res){
res.send({msg:"我是login"})
})
router.get("/zhuce",function(req,res){
res.send({msg:"我是zhuce"})
})
// 暴露路由
module.exports=router
5.7、Express—路由使用
server.js檔案中,引用路由 。
var express=require("express");
var app=express();
// 引用路由檔案
var userRouter=require("./userRouter");
// 中間件中使用路由
app.use("/user",userRouter)
// 請求是localhost:3000/user/路由檔案中的位址
app.listen(3000)
我說:跟直接用express寫請求,怎麼說呢,感覺變化就是,把請求單獨封裝起來了,然後在主服務檔案中引用路由。這個server.js主服務檔案就像是一個控制器,可以控制引用哪個路由。
5.8、靜态資源檔案 —webserver
使用中間件配合
app.use(express.static(path.join(__dirname, “檔案夾名”)));
5.9、express\中間件\mongoose\連接配接MongoDB 聯合小栗子
資料庫服務檔案:index.js
// 封裝資料庫連接配接的内容
var mongoose=require("mongoose")
mongoose.connect("mongodb://localhost:27017/某資料庫名",{ useNewUrlParser: true ,useUnifiedTopology: true})
var db=mongoose.connection
db.on("err",console.error.bind(console,"資料庫連接配接失敗"))
db.on("open",(ok)=>{
console.log("資料庫連接配接成功")
})
var schemauser=new mongoose.Schema({
name:String,
age:Number,
sex:Boolean
})
var col=mongoose.model("集合名",schemauser)//這個庫的名字盡量都加s,因為不加,系統會預設給加上
module.exports=col
中間件:user.js
var express=require("express");
var router=express.Router()
var col=require("../db/index")
router.get("/find",(req,res)=>{
col.find().then((ok)=>{
console.log(ok)
res.send({msg:"查詢的資料",data:ok})
})
})
router.get("/insert",(req,res)=>{
// 執行新增操作
var datacol= new col({
name:"嘻嘻",
age:19,
sex:false
})
// 開始插入
datacol.save().then((ok)=>{
console.log(ok)
})
res.send("我是新增的路由")
})
module.exports=router
node背景服務檔案:server.js
var express=require("express");
var app=express()
app.use("/",(req,res,next)=>{
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type,Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE,OPTIONS');
next()//必須要加
})
// 引入路由檔案
var ruser=require("./router/user")
// 使用中間件調用路由
app.use("/user",ruser)
app.listen(3000)
模闆引擎 EJS
模闆引擎 EJS–配置和使用
下載下傳 :npm install --save ejs
app.set()設定了模版檔案夾的路徑
配置:
app.set("view engine","ejs") //讓express 對模闆進行識别 認識ejs
app.set("views",__dirname+"/ejs")//設定模闆的相對路徑(放置到ejs的檔案夾中)
建立模闆檔案:在指定檔案夾中建立 建立以
.ejs
結尾的檔案來進行編寫模闆。
模闆引擎 EJS—模闆編寫
ejs檔案内的内容和html相同 ,可以寫一個基本html頁面架構放置當中。
1、插入資料:ejs的資料源是在
render("檔案名",{資料})
中進行傳遞的
app.get("/",function(req,res){
res.render("檔案名",{
obj:{
name:"xixi"
}
})
})
2、使用資料
<%= 資料 %>