express 庫
http://www.expressjs.com.cn/
干嘛的:nodejs庫,不用基礎(chǔ)做起,工作簡單化
類似:koa
express特點:
二次封裝,非侵入式,增強形
express搭建服務(wù)
express=require('express')
server=express()
server.listen(端口,地址,回調(diào))
靜態(tài)頁面托管
express.static('./wwww')
server.use(express.static('./wwww'));
接口響應:
各種請求姿勢: get/post/put/delete/....
server.請求姿勢API(地址,處理函數(shù))
server.get(url,(req,res,next)=>{})
server.post(url,(req,res,next)=>{})
....
jsonp請求 == get請求
server.get('/jsonp接口',(req,res,next)=>res.jsonp(json)
設(shè)置回調(diào)函數(shù)的key: server.set('jsonp callback name', '設(shè)定回調(diào)函數(shù)鍵');? 默認callback
參數(shù)接受: req == 請求體
req.query 獲取地址欄的數(shù)據(jù)
? req.body 獲取非地址欄的數(shù)據(jù)? 依賴中間件
? 中間件使用: body-parser? 1. npm install body-parser? 2. require('body-parser')? 3. server.use(中間件())
? req.params 獲取動態(tài)接口名
? req.method 獲取前端提交方式
發(fā)送給瀏覽器: res == 響應體
res.send(any) ~~ res.write + end
JSON: res.json(json)
jsonp: res.jsonp(響應數(shù)據(jù)) 響應數(shù)據(jù)-》jsonp請求時的回調(diào)函數(shù)
404 : res.status(404).send({error:1,msg:"Sorry can't find that!"})
靜態(tài)文件: res.sendFile(path.resolve('public/error.html'))//渲染純 HTML 文件
res.end(any)
后端跳轉(zhuǎn): res.redirect(url)
處理一部分接口 共有業(yè)務(wù)邏輯:
server.all('/admin/*',fn) all匹配全路徑 處理所有HTTP 需要next 延續(xù)后續(xù)
use: 安裝中間件 | 路由
server.use(地址,中間件|路由|函數(shù)體)
中間件(middleware): 不處理業(yè)務(wù),只處理請求? 到? ? 結(jié)束響應? 的中間部分
body-parser
中間件: npmjs.com? 查看使用方式
body-parser 獲取post數(shù)據(jù),限定大小,約定返回數(shù)據(jù)類xx.urlencode({limit:xx})
擴展:
Request 對象 - request 對象表示 HTTP 請求,包含了請求查詢字符串,參數(shù),內(nèi)容,HTTP 頭部等屬性。常見屬性有:
req.app:當callback為外部文件時,用req.app訪問express的實例
req.baseUrl:獲取路由當前安裝的URL路徑
req.cookies:Cookies
req.fresh / req.stale:判斷請求是否還「新鮮」
req.hostname / req.ip:獲取主機名和IP地址
req.originalUrl:獲取原始請求URL
req.path:獲取請求路徑
req.protocol:獲取協(xié)議類型
req.route:獲取當前匹配的路由
req.subdomains:獲取子域名
req.accepts():檢查可接受的請求的文檔類型
req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages:返回指定字符集的第一個可接受字符編碼
req.get():獲取指定的HTTP請求頭
req.is():判斷請求頭Content-Type的MIME類型
Response 對象 - response 對象表示 HTTP 響應,即在接收到請求時向客戶端發(fā)送的 HTTP 響應數(shù)據(jù)。常見屬性有:
res.app:同req.app一樣
res.append():追加指定HTTP頭
res.set()在res.append()后將重置之前設(shè)置的頭
res.cookie(name,value [,option]):設(shè)置Cookie
opition: domain / expires / httpOnly / maxAge / path / secure / signed
res.clearCookie():清除Cookie
res.download():傳送指定路徑的文件
res.get():返回指定的HTTP頭
res.location():只設(shè)置響應的Location HTTP頭,不設(shè)置狀態(tài)碼或者close response
res.render(view,[locals],callback):渲染一個view,同時向callback傳遞渲染后的字符串,如果在渲染過程中有錯誤發(fā)生next(err)將會被自動調(diào)用。callback將會被傳入一個可能發(fā)生的錯誤以及渲染后的頁面,這樣就不會自動輸出了。
res.sendFile(path [,options] [,fn]):傳送指定路徑的文件 -會自動根據(jù)文件extension設(shè)定Content-Type
res.set():設(shè)置HTTP頭,傳入object可以一次設(shè)置多個頭
res.status():設(shè)置HTTP狀態(tài)碼
res.type():設(shè)置Content-Type的MIME類型
path 系統(tǒng)模塊
磁盤路徑:
編碼:
windows:? 'c:\\user\\admin\\a.jpg'
mac: ~/desktop/1901
UI:
windows: c:\user\admin
mac: ~/desktop/1901
path.parse('c:\\wamp\\xx.png'); 磁盤路徑(str -> obj)
{
? root: 'c:\\', 盤符
? dir: 'c:\\wamp', 目錄
? base: 'xx.png',? 文件名
? ext: '.png', 擴展名
? name: 'xx' 文件,不含擴展名
}
path.join('磁盤路徑1','磁盤路徑2')
__dirname 魔術(shù)變量? 返回當前文件所在的磁盤路徑
path.dirname == __dirname? 當前文件位置
path.resolve('磁盤路徑1','磁盤路徑n') 合并磁盤片段,右到左找根,左到右拼接,沒有找到根,以當前文件路徑為根
fs模塊:?
文件操作是異步的
fs.rename('當前文件','該后的文件名',(err)=>{});
fs.readFile('當前文件','該后的文件名',(err)=>{});
multer:? 文件上傳
multer->文件名會隨機->fs模塊改名->path系統(tǒng)模塊解析磁盤路徑
文件上傳:前端表單->后端接收到文件本身->保存到服務(wù)器上->給數(shù)據(jù)庫記錄文件一些信息->庫返回給nodejs相關(guān)信息->nodejs返回給前端
前端: <input type=file enctype="multipart/form-data" name="fieldname1"
后端:multer 接受 form-data編碼數(shù)據(jù)
配置
let multer? = require('multer'); 引入
let objMulter = multer({ dest: './upload' }); 實例化? 返回 multer對象
dest: 指定 保存位置(存到服務(wù)器)
app.use(objMulter.any());? any 允許上傳任何文件
req.files 數(shù)組
fieldname: 表單name名
originalname: 上傳的文件名
encoding: 編碼方式
mimetype: 文件類型
buffer: 文件本身
size:尺寸
destination: 保存路徑
filename: 保存后的文件名? 不含后綴
path: 保存磁盤路徑+保存后的文件名 不含后綴
路由(router):? 告訴你去哪
前端:導向 路由 就 告訴瀏覽器應該去哪
后端: 子服務(wù) 一個路由就是一個小的服務(wù)(server/app)
1. 創(chuàng)建路由
router = express.Router();? 返回路由對象
2. 導出路由
module.exports = router;
3. 安裝路由
app.use('地址',router);
router.use('地址'子router) 需要next 延續(xù)
4. 路由處理響應:
router.響應API(地址, 處理函數(shù))
router.get('/',fn)
router.post('/1',fn)
router.all('*',當前router路由下的驗證工作) 需要next 延續(xù)
前后端交互流程
大后端:
用戶發(fā)送請求 - > (http[s]請求) -> web服務(wù)器(收到) - > nodejs處理請求(返回靜態(tài)、動態(tài))->請求數(shù)據(jù)庫服務(wù)(返回結(jié)果)->nodejs(接收)->渲染頁面->瀏覽器(接收頁面,完成最終渲染)
大前端:
前端 - > http[s]請求 -> web服務(wù)器(收到) - > nodejs處理請求(返回靜態(tài)、動態(tài))->請求數(shù)據(jù)庫服務(wù)(返回結(jié)果)->nodejs(接收)->返回給前端(渲染)->瀏覽器(接收頁面,完成最終渲染)
用戶發(fā)送請求: href/backround:url('...')/src/locaction.href/ajax/jsonp/form>action @import(url...)
讀的是資源
靜態(tài): json,font,css,js,img? ? ? ? ?
動態(tài): ajax,form,jsonp,promise? 要求(寫的參數(shù),數(shù)據(jù))
mysql
關(guān)系數(shù)據(jù)庫(二維表(表頭))
數(shù)據(jù)庫:需要安裝服務(wù)端
服務(wù)端:
a) 開啟 mysql服務(wù)
b) 安裝mysql 開啟服務(wù)
庫操作:
客戶端:
軟件操作(UI工具)
wamp的客戶端是phpmyadmin
phpstudy
navicat 收費
系統(tǒng)命令行: mysql 命令行
語言環(huán)境: 安裝對應的客戶端包 包內(nèi)提供api
nodeJs(后臺管理程序),依賴mysql庫
庫操作? 編碼方式 UUC
建|刪 庫(目錄)
建: CREATE DATABASE? `2017-12-6` DEFAULT CHARACTER SET armscii8 COLLATE armscii8_general_ci;
建|刪|改 表(文件)
創(chuàng)建表頭(字段頭)
CREATE TABLE? `2017-12-6`.`user` (
`name` VARCHAR( 32 ) NOT NULL ,
`age` INT( 3 ) NOT NULL ,
`address` VARCHAR( 128 ) NOT NULL
) ENGINE = INNODB
表操作 增刪改查
增:
INSERT INTO 表 (字段列表) VALUES(值列表)
INSERT INTO user (name,age,address) VALUES('蘇菲',38,'')
刪:
DELETE FROM 表 WHERE 字段名=值
DELETE FROM user WHERE name='alex'
改:
UPDATE 表 SET 字段名=值 WHERE 字段名=值
UPDATE user set name='sufei' WHERE name='蘇菲'
查:
SELECT ? FROM 表
SELECT * FROM user? 查所有
mongoDb
下載:https://www.mongodb.com/download-center
安裝:https://www.cnblogs.com/keyi/p/10984514.html
一路下一步
設(shè)置庫 username:root/password:root123
注意:
1)? 測試服務(wù)端是否啟動:
a)理論上服務(wù)器會開機就啟動
手動啟動:
手動啟動服務(wù)端:安裝目錄\Server\4.0\bin\? mongod 回車
b)服務(wù)服務(wù)器:
啟動客戶端 去 訪問 安裝目錄\Server\4.0\bin\? ? mongo 回車
port=27017 默認端口
mongodb://127.0.0.1:27017 協(xié)議+IP+端口
2) 指定數(shù)據(jù)存儲目錄: 需要指定一次? ***
mongod --dbpath c:\data\db? ? db目錄要手動創(chuàng)建
3) 環(huán)境變量:為了在任意盤符下去啟動庫? mongod服務(wù)端|mongo客戶端