天天看點

Node.js note3(http子產品&express&node+mongoose連接配接MongoDB&模闆引擎EJS)http子產品express模闆引擎 EJS

http子產品

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

Node.js note3(http子產品&express&node+mongoose連接配接MongoDB&模闆引擎EJS)http子產品express模闆引擎 EJS

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來調用不同的功能顯示。

Node.js note3(http子產品&express&node+mongoose連接配接MongoDB&模闆引擎EJS)http子產品express模闆引擎 EJS
Node.js note3(http子產品&express&node+mongoose連接配接MongoDB&模闆引擎EJS)http子產品express模闆引擎 EJS

登入/注冊頁面布局:

<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"))
           
Node.js note3(http子產品&amp;express&amp;node+mongoose連接配接MongoDB&amp;模闆引擎EJS)http子產品express模闆引擎 EJS

來看看請求結果:

Node.js note3(http子產品&amp;express&amp;node+mongoose連接配接MongoDB&amp;模闆引擎EJS)http子產品express模闆引擎 EJS
Node.js note3(http子產品&amp;express&amp;node+mongoose連接配接MongoDB&amp;模闆引擎EJS)http子產品express模闆引擎 EJS

express

express 第三方的架構 基于nodejs極簡web架構 地位非常

先來看看最簡單最基本的用法:

Node.js note3(http子產品&amp;express&amp;node+mongoose連接配接MongoDB&amp;模闆引擎EJS)http子產品express模闆引擎 EJS

server.js

Node.js note3(http子產品&amp;express&amp;node+mongoose連接配接MongoDB&amp;模闆引擎EJS)http子產品express模闆引擎 EJS

demoRou.js

Node.js note3(http子產品&amp;express&amp;node+mongoose連接配接MongoDB&amp;模闆引擎EJS)http子產品express模闆引擎 EJS

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來應用這部分函數。

比如說我們自己做一個簡單例子 ,自己做一個中間件:

Node.js note3(http子產品&amp;express&amp;node+mongoose連接配接MongoDB&amp;模闆引擎EJS)http子產品express模闆引擎 EJS

然後導入我們暴露的中間件子產品:

var myselfMW=require('./myself-middleware')

Node.js note3(http子產品&amp;express&amp;node+mongoose連接配接MongoDB&amp;模闆引擎EJS)http子產品express模闆引擎 EJS

然後用

app.use(中間件)

在中間件中調用我們寫的子產品函數:由于在中間件的最後一位,是以最後執行。

Node.js note3(http子產品&amp;express&amp;node+mongoose連接配接MongoDB&amp;模闆引擎EJS)http子產品express模闆引擎 EJS

擴充:

路由中間件比如 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

Node.js note3(http子產品&amp;express&amp;node+mongoose連接配接MongoDB&amp;模闆引擎EJS)http子產品express模闆引擎 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、使用資料

<%= 資料 %>

繼續閱讀