摘要:一默認使用的模塊化方案,默認是的模塊化方案,兩者有本質區別。的去尋找引入的依賴時,如果是自帶的模塊,比如文件模塊,只需要填寫即可。這是版本入口文件使用了兩個路由器路由,分別處理和請求邏輯。核心操作全部依賴模型對象來執行。
一、Node.js默認使用commonJs的模塊化方案,TypeScript默認是ES6的模塊化方案,兩者有本質區別。
1.Node.js的去尋找引入的依賴時,如果是Node自帶的模塊,比如fs文件模塊,只需要填寫fs即可。如果是自己定義的模塊,那么需要加入./(使用相對路徑),暴露接口使用exports或者module.exports
2.TypeScript的 import * from url 的引入依賴,需要填寫完整的相對路徑,否則是找不到模塊的,暴露接口使用export .
3.Node中使用TypeScript需要下一些包去支持,比如express框架這些,還有一些支持內置對象的包:
4.github源碼下載地址
"dependencies": { "@babel/core": "^7.4.0", "@types/core-js": "^2.5.0", "browserify": "^16.2.3", "connect-mongo": "^2.0.3", "cookie-parser": "^1.4.4", "ejs": "^2.6.1", "express": "^4.16.4", "express-session": "^1.15.6", "mongoose": "^5.4.19", "nodemon": "^1.18.10", "sha1": "^1.1.1" }, "devDependencies": { "@types/express": "^4.16.1", "@types/node": "^11.11.4", "ts-loader": "^5.3.3", "ts-node-dev": "^1.0.0-pre.32", "typescript": "^3.3.4000", "webpack": "^4.29.6", "webpack-cli": "^3.3.0" } "具體還需要什么,可以上網去搜索下"二、入口文件,我們使用 ejs 引擎渲染( res.render() )
1.Node.js使用ejs渲染的核心技巧是渲染數據的指定
2.盡量一個渲染數據對象包括所有的渲染內容
3.一個渲染對象可以有很多個屬性,每次get請求
時先發送一個空的對象到后端,再根據需求邏輯指定
對象屬性和內容,最后還是傳輸那個對象回來。避免了
傳送過多的對象,代碼看起來很復雜
4.渲染數據的位置在渲染的ejs文件中的放置,
如果需要樣式,可以事先在HTML結構中包一層HTML結構,
然后用CSS定義好。
"這是Node.js版本" "http://入口文件使用了兩個路由器路由,分別處理get和post請求邏輯。 即使是同一個路由,但是請求方式不一樣,他們的處理邏輯不會沖突" const express = require("express"); const db = require("./common/db"); const app = express(); const uirouter = require("./router/uirouter"); const postrouter = require("./router/postrouter"); app.set("views", "views"); app.set("view engine", "ejs"); db.then(() => { app.use(uirouter); app.use(postrouter); }) app.listen(8080, err => { if (!err) { console.log("端口號監聽成功") } else { console.log("端口監聽失敗", err) } }) ----------------- "這是TypeScript版本" import express from "./node_modules/@types/express/index"; import db from "./common/db1"; import uirouter from "./router/uirouter1"; import postrouter from "./router/postrouter1"; const app: any = express(); app.set("views", "views"); app.set("view engine", "ejs"); db.then((): void => { app.use(uirouter); app.use(postrouter); }); app.listen(8080, (err): void => { if (!err) { console.log("服務器連接成功"); } else { console.log("服務器連接成功"); }; });三、get請求的路由處理模塊
1.路由模塊的核心,一個路由處理一個邏輯
2.res.end / send / render 后面再寫邏輯也不會執行了,因為已經返回響應。
3.對于cookie的使用我們需要依賴第三方中間件
4.res.render()里面是寫ejs渲染的文件,所以可以不用寫ejs的后綴
5.res.redirect()里面寫的是定向的那個路由,指定前往那個路由,
然后根據那個路由的邏輯處理,此時瀏覽器中的url會改變。這就叫重定向
"http://這里我們使用了第三方中間件處理cookie并且 攜帶數據,大概設計思路: 1.沒有登錄過不能進入個人中心,會跳轉到登錄界面 2.登錄過后會有一個免登錄期限進入個人中心 3.在登錄界面可以通過用戶名和郵箱找回密碼 4.在 Node 端處理邏輯,只有res.redirect()可以 改變瀏覽器的網址,切記。 5.每個路由器路由代表每個不同的邏輯 6.get模塊只處理渲染哪個頁面的邏輯" const { Router } = require("express"); const model = require("../common/model"); const cookieParse = require("cookie-parser"); const router = new Router(); router.use(cookieParse()) router.get("/index", (req, res) => { res.render("index.ejs", { err: "" }) }) router.get("/", (req, res) => { res.redirect("/index"); }); router.get("/login", (req, res) => { res.render("login.ejs", { err: "" }); }); router.get("/register", (req, res) => { res.render("register.ejs", { err: "" }); }); router.get("/reset", (req, res) => { res.render("reset.ejs", { err: "" }); }); router.get("/usercenter", async (req, res) => { const result = await model.findOne({ _id: req.cookies.userid }); if (!result) { res.redirect("/login") return } res.render("usercenter.ejs", { err: "" }); }); module.exports = router;四、post模塊,處理各種數據庫的CRUD操作,后臺邏輯。(核心)
1.CRUD操作全部依賴模型對象來執行。
2.限制對象一旦生成那么無法改變,除非刪除數據庫
3.限制對象的增刪改查都返回的是一個promise對象,
如果這時候去 if() 里判斷,無論有什么樣的結果,都是true,
而且這個 CRUD 操作都是異步,所以我們把外部函數變成 async 函數,
這樣可以配合 await 實現最佳異步,還可以獲取他們的返回值進行
if 判斷。(Node.js的后端核心)
const { Router } = require("express"); const express = require("express"); const model = require("../common/model"); const cookieParse = require("cookie-parser"); const sha1 = require("sha1"); const router = new Router(); router.use(cookieParse()) router.use(express.urlencoded({ extended: true })) router.post("/login", async (req, res) => { const { username, password } = req.body; const result = await model.findOne({ username, password: sha1(password) }); if (!result) { res.render("login", { err: { usernameloginerr: "用戶名或密碼錯", username: username } }) return; } const userid = result.id; res.cookie("userid", userid, {maxAge:1000*60*10}); res.redirect("/usercenter") return }); router.post("/register", async (req, res) => { const { username, password, repassword, email } = req.body; const err = {}; const usernameReg = /^[A-Za-z0-9_]{5,10}$/; const passwordReg = /^[A-Za-z0-9_]{5,12}$/; const emailReg = /^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/; if (!usernameReg.test(username)) { err.usernamereerr = "用戶名格式錯誤"; } if (!passwordReg.test(password)) { err.passworderr = "密碼格式錯誤"; } if (repassword !== password) { err.repassworderr = "兩次密碼輸入不一致"; } if (!emailReg.test(email)) { err.emailerr = "郵箱格式錯誤"; } const usernameresult = await model.findOne({ username }); if (usernameresult) { err.usernamereerr = "用戶名已存在"; res.render("register", { err }) return }; const emailresult = await model.findOne({ email }); if (emailresult) { err.emailerr = "郵箱已被注冊"; res.render("register", { err }) return } if (err.usernamereerr || err.passworderr || err.repassworderr || err.emailerr) { err.username = username; err.email = email; res.render("register", { err }) return } model.create({ username: username, password: sha1(password), email: email }) res.redirect("/index") }); router.post("/reset", async (req, res) => { const { username, password, repassword, email } = req.body; const err = {}; const result = await model.findOne({ username, email }); if (!result) { if (repassword !== password) { err.repassworderr = "兩次密碼輸入不一致" } err.usernamereerr = "用戶名或者郵箱輸入有誤"; err.emailerr = "用戶名或者郵箱輸入有誤"; res.render("reset.ejs", { err }) return } else { await model.updateOne({ username, email }, { password: sha1(password) }); res.redirect("/usercenter"); return } }) module.exports = router;五、工具類模塊 model對象和database模塊 有 天坑 需要注意
限制對象一旦生成那么無法改變,除非刪除數據庫
"database模塊" const mongoose = require("mongoose"); module.exports = new Promise((resolve, reject) => { mongoose.connect("mongodb://localhost:27017/userinfos", { useCreateIndex: true, useNewUrlParser: true }); mongoose.connection.once("open", err => { if (!err) { console.log("數據庫連接成功") resolve() } else { console.log("數據庫連接失敗", err) reject(err) } }) }) ------ "model對象模塊" "這里定義限制對象時,一定要考慮好, 否則數據庫連接啟動后,除非刪除數據庫, 不然無法修改限制對象的內容!!!!" const { Schema, model } = require("mongoose"); const ajaxschema = new Schema({ username: { type: String, unique: true, required: true }, password: { type: String, required: true }, email: { type: String, unique: true, required: true }, }) const model1 = model("userinfo", ajaxschema); module.exports = model1;六、 ejs 的渲染目錄
ejs 的渲染數據在ejs文件中的格式有三種
1. <% data %> 里面可以寫任意代碼
2. <%= data %> 里面寫的代碼最終會轉義后再出現(推薦)
3. <%- data %> 里面寫的代碼最終不會轉義后就出現(不安全)
"index.ejs "找回密碼 ------------ "register.ejs"Document 歡迎來到首頁
登陸 注冊 個人中心 ------- "login.ejs"Document
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/117574.html
摘要:一默認使用的模塊化方案,默認是的模塊化方案,兩者有本質區別。的去尋找引入的依賴時,如果是自帶的模塊,比如文件模塊,只需要填寫即可。這是版本入口文件使用了兩個路由器路由,分別處理和請求邏輯。核心操作全部依賴模型對象來執行。 一、Node.js默認使用commonJs的模塊化方案,TypeScript默認是ES6的模塊化方案,兩者有本質區別。 1.Node.js的去尋找引入的依賴時,如果...
摘要:一默認使用的模塊化方案,默認是的模塊化方案,兩者有本質區別。的去尋找引入的依賴時,如果是自帶的模塊,比如文件模塊,只需要填寫即可。這是版本入口文件使用了兩個路由器路由,分別處理和請求邏輯。核心操作全部依賴模型對象來執行。 一、Node.js默認使用commonJs的模塊化方案,TypeScript默認是ES6的模塊化方案,兩者有本質區別。 1.Node.js的去尋找引入的依賴時,如果...
摘要:特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 本以為自己收藏的站點多,可以很快搞定,沒想到一入匯總深似海。還有很多不足&遺漏的地方,歡迎補充。有錯誤的地方,還請斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應和斧正,會及時更新,平時業務工作時也會不定期更...
摘要:另外,中間件還提供了諸如日志記錄之類功能,便于查詢任務狀態以及信息。 DevOps大熱,這里我們借著上線一個node中間件,簡單介紹下前端容器化相關的內容 原文:http://blog.thonatos.com/dockerizing-your-frontend-project/ (很多東西還來不及寫,有時間再補充吧T.T,比如:如何快速在服務器部署vpn神馬の一定很有用...) In...
摘要:前端每周清單第期現狀分析與優化策略單元測試爬蟲作者王下邀月熊編輯徐川前端每周清單專注前端領域內容,以對外文資料的搜集為主,幫助開發者了解一周前端熱點分為新聞熱點開發教程工程實踐深度閱讀開源項目巔峰人生等欄目。 showImg(https://segmentfault.com/img/remote/1460000011008022); 前端每周清單第 29 期:Web 現狀分析與優化策略...
閱讀 2099·2021-11-11 16:55
閱讀 3169·2021-10-11 10:58
閱讀 3036·2021-09-13 10:28
閱讀 3966·2021-07-26 23:57
閱讀 1005·2019-08-30 15:56
閱讀 1330·2019-08-29 13:15
閱讀 1257·2019-08-26 18:18
閱讀 1263·2019-08-26 13:44