今天學習的內容
1:復習昨天重點
2:大魚喂小魚;首頁
? 大魚喂小魚:
? 大魚碰撞小魚,小魚吃飽,小魚身體圖片下標 = 0
? 碰撞檢測: collsion.js 大魚碰撞食物;
3:今天的目標
? 3.1:nodejs 模塊
? 遇到問題:nodejs 作者nodejs 不足
? (1)生活示例:實用主義;完美主義
? (2)招聘條件:50% >公司(技術型,互聯網公司)
? 3.2:下載配置
? https://npm.taobao.org/mirrors/node
? node-v9.9.0-x64.msi? 64位windows版本
? node-v9.9.0-x86.msi? 32位windows版本
? node-v9.9.0.pkg? ? ? mac
? 3.3:阿里面試題:用戶在在瀏覽器輸入 www.taobao.com直到
? ? 看到網頁發生了什么?
? ? (1)操作系訪問網絡的DNS服務器,把域名轉ip地址
? ? (2)瀏覽器使用IP地址向淘寶發請求
? ? (3)淘寶服務器接收請求,并解析請求內容,查詢找資源,
? ? ? 可能數據庫,構建并返回HTTP響應消息
? ? (4)瀏覽器接收并解析響應消息
? ? (5)瀏覽器緩存接收響應內容,并解析和渲染內容
?
? 3.4:靜態網頁和動態網頁
? 靜態:網頁內容任何人任何時間訪問都是不變的..
? ? ? ? HTML/CSS/JS/Flash/視頻音頻
? 動態:網頁內容不同人在不同時間訪問可能是不同的..
? ? ? ? DB/JSP/PHP/ASP/Node.JS
? JSP=html+java? 功能強大可靠,適合大型企業項目(阿里;銀行)
? 2003-2004 淘寶[php+mysql];->mysql(oracle)->php->java->服務器
? ? ? ? ? ? ->小型機->oracle->{服務器+java+OC(mysql)}--卡車
? PHP=html+php? 簡單易用:適合互聯網項目(論壇)? --家用轎
? https://cn.wordpress.org/
? ASP.NET=html+c#? 易用;貴點
? Node.js=html+js? 性能好--(跑車)
?
node.js適合項目(io密集型) node.js 不適合項目(cpu密集型)
輸入輸出[查詢;添加] 滴滴打車;天氣預報...
? ? ? ?
?
? 3.5:Node.JS
? Node.js不是js,是一種運行在服務器端開發平臺(開發語言用js),
? 歷史上第一次有一種語言可以通吃前后臺.
? https://npm.taobao.org/mirrors/node? 淘寶鏡像
?
? 3.6:Node.JS 運行模式
? (1)交互模式---一般測試
? ? 輸入一行代碼執行一行
? ? 在命令行狀態下輸入
? ? node 回車
? ? 退出 ctrl+c? 二次
? (2)腳本模式--正式項目中使用方式
? ? 把要執行的所有語句編寫在一個文本文件中(后綴名任意,沒有也行),一次性提交node解析器執行
? ? node? x.js? 回車
? 解釋器: C:\Program Files\nodejs\node.exe
? 練習:02_node.js 打印出九九乘法表,
? 以腳本模式在ws運行
? 3.7:Node.JS 如何自學一門新語言--Node.js
? (1)了解背景
? ? --百度百科 Node.JS? [事件驅動,非阻塞I/O 模型]
? (2)搭建開發環境,編寫Hello World
? (3)數據類型
? ?
前端js數據類型
1:原始[基本]? ? number;string;boolean;null;undefined
2:引用/對象類型
? ? ES對象:Math;Date;RegExp;Object;Function;Error.....
? ? BOM/DOM對象:window;docuemnt;screen;event...
? ? 自定義:{}
后端Node.js 數據類型
1:原始[基本]? number;string;boolean;null;undefined
2:引用/對象類型
? ? ES對象:Math;Date;RegExp;Object;Function;Error.....
? ? 自定義:{}
? (4)變量和常量
? node js 提供了10幾萬·個專用對象?
運算符:邏輯運算·? 算術運算? 三目運算? 位運算? 副職運算? typeof? instanceof?
邏輯結構:循環結構? while do while? for? ? for()? 選擇結構? if else? switch case
聲明一個保存五個學生的數學;
7.通用小程序
? nodejs 模塊
modal模態框
model模型
module模塊? 是nodejs特有? 是一個web項目中的功能分為不同的模塊
每一個模塊都是一個獨立的構造函數? 解釋器都會自動為js文件添加如下代碼
? (function(exports,require,module,__filename,__dirname){
expoirt{}用于聲明向外部導出自己的成員? 使用exports對象? 對外導出或者公開自己的內部成員供其他成員使用?
require:fn用于導入其他模塊? 并且創建制定模塊對象? 創建一個模塊的實力? 模塊名稱就是模塊的文件名
module:只帶當前模塊對象
你寫的代碼?
})
導出
const PI=Math.PI;
function getSize(r){
? var size=2*PI*r;
? return size;
}
function getPerimeter(r){
? ? var p=PI*r*r;
? ? return p;
}
//exports.PI=PI;
exports.getSize=getSize;
exports.Perimeter=getPerimeter;
導入
var m=require("./circle");
var c=m.getSize(2);
console.log(c);
var d=m.Perimeter(3);
console.log(d);
?
module指代當前對象
exports和modeule.exports
二者都可以用于指向外界導出自己的內部成員
真正導出數據modelu.export
node.js底層代碼? exports=module.exports
如果導出一個完整的對象只能是m e? ? 只導出屬性 函數或變量? 對象只能用me導出?
最好都用? module.exports? ? ?
編寫數組模塊
sum(),
module.exports.sum=sum;
module.exports.avg=avg;
var m=require("./arr");
!!!!!./必須要寫? ./
exports不能導出對象? ?
3.8? nodejs 模塊的分類
三種:1.官方提供? require(“模塊名稱”)
? 2.第三方模塊;
3.用戶自定義的模塊? nodule.exports? require()
3.9
day02
? 通過nodejs搭建服務器
1. 引入nodejs核心模塊? http
2. const http=require(“http”);
3. 創建一個服務器實例
4. let sever=http.createSever((req,res)=>{res.end(“it works.”);});
nodejs的全局模塊? global? 她的使用不需要引入
dirname? 當前文件所在目錄的絕對路徑?
全局對象console?
全局對象? process? ? thread? 線程執行的最小單位
process.kill()結束某一個軟件的運行?
今天學習的內容
1:復習昨天的內容
2:首頁
3:今天的目標
? 3.1:node.js? 模塊分類(自定義模塊)
? (1)官方提供模塊
? (2)第三方模塊,單獨下載 www.npmjs.com
? (3)自定義模塊
? ? #文件模塊: 創建一個js文件,如 m3.js 導出需要公開數據
? ? ? ? ? ? ? ? 其它模塊 require("./m3");模塊
? ? #目錄模塊:
? ? ? 方式一:創建一個目錄,假設名為 m4,其中創建名為index.js
? ? ? ? ? ? 文件,導出需要公開的數據,其它模塊引用
? ? ? ? ? ? require("./m4");
? ? ? 方式二:創建一個目錄,假設名為 m5,其中創建名為 5.js
? ? ? ? ? ? 創建package.json main指定啟動文件 5.js
? ? ? 方式三:創建一個目錄,必須名為 node_modules,
? ? ? ? ? ? 其中再創建一個目錄,假設 m6 ,其中創建
? ? ? ? ? ? package.json描述文件,其中聲明main屬性
? ? ? ? ? ? 指定默認執行js文件,如 6.js ,其中導出需要
? ? ? ? ? ? 公共數據,其它模塊require("m6");
練習:使用第三種方式,創建二個目錄模塊circle;rectangle
都對外公開兩個方法
size()? ? ? 返回指定圖形面積
perimeter();返回指定圖形周長
最后在最外層模塊,引入上述兩個模塊
circle.size(r) circle.perimeter(r)
r.size(w,h);? r.perimeter(w,h);
常見錯誤:
1: Error: Cannot find module './m4'? 目錄結構錯誤
? 3.2:node.js? --- 特性(事件驅動; 非阻塞IO)
? ? php? ? 阻塞? IO {有順序;效率差}
? ? nodejs 非阻塞IO{無序;效率高}
? 3.3:node.js? npm (Node Package Mangaer)
? ? node.js的第三方模塊/包管理器,可以用于下載;更新;刪除;
? ? 維護包依賴關系的工具
? ? npm 工具默認www.npmjs.com網站下載所需的第三方模塊
? ? 包
? ? 使用npm工具下載一個新的軟件包
? ? npm install? 包名? ? 下載
? ? npm uninstall 包名? ? 刪除
? ? 示例:
? ? nodejs 下載nodejs mysql驅動程序(第三方模塊)
? ? 1:查找 mysql 模塊? ? ? www.npmjs.com? ? [mysql]
? ? 2:npm install mysql
? ? 淘寶:開發工具 cnpm
? ? cnpm install mysql? ? [99.99%]
? 3.3:node.js? 官方模塊
? querystring? 請求http中的查詢字符串? var obj=qs.parse(str);將查詢字符串轉換為js對象? ? ? qs.stringfy(obj)將對秀昂轉換為 js的字符串
eg:
//用;來加載querystring模塊? 官方提供好的模塊要用常量? 只是使用? 不修改
? ? //global buffer不用require? 優先級別較高
const qs=require("querystring");
//2。創建字符串
var str="uname=tom&ypwd=123&page=3";
//3將字符串轉換為js對象
var obj=qs.parse(str);
console.log(obj);
//4對象=》字符串
var obj1={ uname: 'hah', ypwd: '12j3', page: '39' };
var str1 =qs.stringify(obj1);
console.log(str1);
? 3.3:node.js? 官方模塊
url模塊? 用來解析一個http請求地址? 獲取其中各個不同部分
var obj=url.parse(str);url轉對象
var obj=url.parse(str,true)將其中的查詢字符串也轉換為對象;
egconst? url=require("url");
var str="https://jd.com:443/ad/index?uname=hah&upwd=12345&page=50";
var obj2=url.parse(str,true);
console.log(obj2);
? 3.3:node.js? 官方模塊
buffer? 緩沖區? 內存是速度介于 硬盤和cpu之間? 本質上是內存的一塊區域? 用于暫時存儲? 數據? 該區域? 叫做緩存區?
1. 創建緩沖區? var buffer=Buffer.alloc(1024);
2. 創建一個數字數組的緩沖區
3. ? var buffer1=Buffer.from([1,2,3,4])
4. ? 創建一個字符串
5. var buffer2=Buffer.from(“abc”)
6. 緩沖區? 將緩沖區轉換為字符串?
7. //創建? 大小為2k的緩沖區? 不用requier? 優先級較高
? ? var buffer=Buffer.alloc(1024*2);
console.log(buffer.length);
//數組
? var buf1=Buffer.from([1,2,3,4]);
console.log(buf1);
//字符串
var buf2=Buffer.from("abhsjsj");
console.log(buf2);
//字符串緩沖區 轉換為字符串
var str=buf2.toString();
console.log(str);
8.?
? 3.3:node.js? 官方模塊
? 文件讀寫模塊? 增刪改查
1. 阻塞方案? 有順序 效率低
阻塞的向文件中? var data=fs.readFileSync(“文件名”);
寫內容? fs.writeFileSync(文件名,內容) ;先將原有的內容刪除新內容
//阻塞方式? 讀取文件? public/。。。。index.html? main.html
//加載fs模塊
var fs=require("fs")
//創建兩個變量? 保存名稱
var f1="./public/index.html";
var f2="./public/main.html";
console.log(1);
//讀取第一個
var data=fs.readFileSync(f1);
console.log(data);
console.log(2);
//第二個
var data1=fs.readFileSync(f2);
console.log(data1)
文件寫入用
var fs=require("fs");
//創建二個變量保存文件名 文件不存在自動創建? 文件夾不存在就直接報錯
var f1="./public/1.log";
var f2="./public/2.log";
//寫入文件
console.log(1);
fs.writeFileSync(f1,new Date().toString);
console.log(2);
fs.writeFileSync(f2,new Date().toString);
console.log(3);
copy文件:先讀取寫入
var fs=require("fs");
var f1="./public/3.css";
var f2="./public/33.css";
//創建二個變量保存文件名 文件不存在自動創建? 文件夾不存在就直接報錯
var data=fs.readFileSync(f1);
fs.writeFileSync(f2,data);
console.log(data.toString());
fs.appendFileSync(f2,data);
文件中? 追加內容? fs.appendFileSync(文件名 ,內容)
2. 非阻塞方案? 無順序? 效率高
不好控制? fs.readFile(fileNmae,(err,data)=>{})? 回掉函數文件讀取之后? data就是內容? err是錯誤?
var fs=require("fs");
var f1="./public/3.css";
console.log(1);
fs.readFile(f1,(err,data)=>{
? if(err) throw err;
? console.log(data);
? ? console.log("讀取結束");
})
console.log(2);
console.log(3);
console.log(4);
回調函數參數的順序不能變;
寫入fs.writeFile(文件名,(err)=>{
})追加fs.appendFile(文件名,(err)=>{
})
var fs=require("fs");
var f1="./public/4.css";
var f2="./public/44.css";
fs.readFile(f1,(err,data)=>{
? ? if(err) throw err;
? ? fs.writeFile(f2,data,(err)=>{if(err){throw err;}})
})
注意要在讀取文件之中? 處理寫入文件? ?
http模塊? ? 給予http協議客戶端程序一? 服務器程序;
//創建服務器對象
//創建服務器對象
var http=require("http");
? ? var server=http.createServer();
//綁定端口? 端口? 1-65535;四個6不行? 8888可以
server.listen(8888);
//注冊事件? 客戶端請求事件、 req請求對象? res響應對象
server.on("request",(req,res)=>{
? ? console.log("nodejs服務器端接收到一個請求");
? ? //解析客戶端發來的請求消息
? ? console.log(req.method);//請求方法
? ? console.log(req.url);//請求的url
? ? console.log(req.httpVersion);//http協議版本
? ? res.write("hello world");
? ? res.end();
})
//響應客戶的消息? ? res.write()向客戶端發送字符串? res.send()響應結束;
? 作業1:大小小,小小大
? 大魚喂小魚,金色光環特效,漂浮生物
//1:加載http模塊
const http = require("http");
const fs = require("fs");
const url = require("url");
//2:創建http服務器
var server = http.createServer();
//3:綁定監聽端口
server.listen(3000);
//4:注冊事件 request
server.on("request",(req,res)=>{
? ? console.log("node.js 服務器端接收請請求");
? ? //解析客戶端發來的請求消息
? ? //console.log(req.method); //GET POST
? ? //console.log(req.url);
? ? //console.log(req.httpVersion); //http協議
? ? var f=null;
? ? var obj = url.parse(req.url,true);
? ? if("/index.html" == obj.pathname){
? ? ? f="./index.html";
? ? }else if("/login.html" == obj.pathname){
? ? ? ? f="./login.html"
? ? }else {
? ? ? f="./404.html";
? ? }
? ? ///index.html
? ? //讀取index.html文件內容返回給客戶端
? ? fs.readFile(f,(err,data)=>{
? ? ? ? if(err)throw err;
? ? ? ? res.write(data);
? ? ? ? res.end();
? ? });
});
req 請求對象? ?
res.setHeader("Content-Type","text/html;charset=UTF-8");//設置字符集編碼?
res.write("<h1>打飛機</h1>>");
res.end()
實現注冊
const http = require("http");
const fs = require("fs");
const url = require("url");
//2:創建http服務器
var server = http.createServer();
//3:綁定監聽端口
server.listen(3000);
//4:注冊事件 request
server.on("request",(req,res)=>{
? ? console.log(res.url);
? ? console.log("node.js 服務器端接收請請求");
? ? var obj = url.parse(req.url,true);
? ? var f=null;
? ? if("/reg.html" == obj.pathname){
? ? ? ? f="./reg.html";
? ? ? ? fs.readFile(f,(err,data)=>{
? ? ? ? ? ? if(err)throw err;
? ? ? ? ? ? res.setHeader("Content-Type","text/html;charset=UTF-8");
? ? ? ? ? ? res.write(data);
? ? ? ? ? ? res.end();
? ? ? ? });
? ? }else if("/reg.do" == obj.pathname){
? ? ? ? var f1="./login.log";
? ? ? fs.appendFile(f1,("uname="+obj.query.uname+" "),(err)=>{
? ? ? ? ? ? if(err)throw err;
? ? ? ? })
? ? ? ? fs.appendFile(f1,("upwd="+obj.query.upwd+" "),(err)=>{
? ? ? ? ? ? if(err)throw err;
? ? ? ? ? ? res.setHeader("Content-Type","text/html;charset=UTF-8");
? ? ? ? ? ? res.write("注冊·完成");
? ? ? ? ? ? res.end();
? ? ? ? })
? ? ? ? console.log("a");
? ? }
? ? ///index.html
? ? //讀取index.html文件內容返回給客戶端
});
數據庫的種類
1. 關系型數據庫
mysql 單表500萬 100列行 opracle sql server? mysql一秒25次?
mogodb redis? 20000以上 memcache? nosql 你不僅僅是sql
redis高并發? ? HBASE? 1000萬列
2. 非關系型的數據庫
3.
sql語句的分類·
DDL定義語言 create drop alert
DML操作語句insert update、 delete
DQL查詢語句 select
DCL 數據的控制語句 授權 恢復? 回收權利 recover? grand‘?
Nodejs 訪問·mysql的服務器
:安裝mysql‘的驅動程序
? 為了精簡nodejs的解釋器? 官方沒有提供訪問任何數據庫相關的抹開I 必須要使用npm工具下載? npm。Js?
三部? 創建數據庫連接?
const mysql=require(“mysql:);
var conn=mysql.createConnection({})
3. 發送語句給哦數據庫執行
4. conn.query(“sql”,(err,result){})
5. 關閉連接
6. const mysql=require("mysql");
var conn=mysql.createConnection({
? ? host:"127.0.0.1",
? ? user:"root",
? ? password:"",
? ? database:"xz",
? ? port:3306
});
console.log(conn);
//加載mysql模塊
var sql="INSERT INTO xz_admin(uname,upwd) VALUES ('kk',md5('123'))";
//創建sql語句? 并發送
conn.query(sql,(err,result)=>{
? ? if(err){throw err}
? ? console.log(result);
? ? conn.end();
})
7. 判定添加成功的條件
8. if(result.affectedRows>0){
? ? console.log("添加成功");
}
mysql模塊的使用? 知道? 網絡中常見的攻擊手段? sql注入? 利用規則將危險代碼? 加入到sql語句里邊?
占位符技術解決問題?
const mysql=require("mysql");
var conn=mysql.createConnection({
? ? host:"127.0.0.1",
? ? user:"root",
? ? password:"",
? ? database:"xz",
? ? port:3306
});
var uname="dingding";
var upwd=123456;
//console.log(conn);
//加載mysql模塊
var sql=`SELECT COUNT(uid) as c FROM xz_user WHERE uname=? AND upwd=?`;
//var sql="INSERT INTO xz_admin(uname,upwd) VALUES ('xianghong',md5('66666'))";
//創建sql語句? 并發送
conn.query(sql,[uname,upwd],(err,result)=>{
? ? if(err){throw err}
? ? console.log(result[0].c);
if(result[0].c>0){
? ? console.log("成功");
}
else{
? ? console.log('失敗');
}
})
創建鏈接池
const mysql=require("mysql");
const http=require("http");
const url=require("url");
const fs=require("fs");
var server = http.createServer();
var pool=mysql.createPool({
? ? host:"127.0.0.1",
? ? user:"root",
? ? password:"",
? ? database:"tmooc",
? ? port:3306,
? ? connectionLimit:5
});
//3:綁定監聽端口
server.listen(3000);
//4:注冊事件 request
server.on("request",(req,res)=>{
? ? res.setHeader("Content-Type", "text/html;charset=UTF-8");
? ? var obj=url.parse(req.url,true);
? ? var sname=obj.query.sname;
? ? var score=obj.query.score;
? ? var now=new Date();
? ? var path=obj.pathname;
? ? reg=/^[0-9a-z\u4e00-\u9fa5]{2,}$/i;
? ? if(path=="/add.do") {
? ? ? ? if (reg.test(sname) && reg.test(score)){
? ? ? ? ? ? var sql = "insert into stu values(null,?,?,?)";
? ? ? ? pool.query(sql, [sname, score, now], (err, result) => {
? ? ? ? ? ? if (err) {
? ? ? ? ? ? ? ? throw err
? ? ? ? ? ? }
? ? ? ? ? ? console.log(result);
? ? ? ? ? ? if (result.affectedRows > 0) {
? ? ? ? ? ? ? ? res.write("<h1>登記成功</h1>");
? ? ? ? ? ? ? ? res.end();
? ? ? ? ? ? }
? ? ? ? ? ? else {
? ? ? ? ? ? ? ? res.write("<h1>登記失敗</h1>");
? ? ? ? ? ? ? ? res.end();
? ? ? ? ? ? }
? ? ? ? })
? ? }
? ? else{
? ? ? ? ? ? res.write("<h1>數據格式有誤 請檢查!</h1>");
? ? ? ? ? ? res.end();
? ? ? ? }
? ? }
? ? else if(path=="/add.html"){
? ? ? fs.readFile("./add.html",(err,data)=>{
? ? ? ? ? if(err){throw err}
? ? ? ? ? res.write(data);
? ? ? ? ? res.end();
? ? ? })
? ? }
})
? js將數組轉換為? json字符串
var json=JSON .stringfy(result)
http開發效率有點低?
第三方模塊 express
簡化版本的http;
如果使用官方的http模塊? 但是這個模快是一個非常底層的模塊? 推薦使用? http模塊進一步封裝的 簡化模塊?
該模塊的指甲哦顧問景象站http://www.expressjs.com.cn
1. 記載模塊
2. var express=require(“express”)
3. var app=express();
4. 創建express對象
5. var server=tttp.CreateServer(app);
6. 創建服務器對象?
7. server.listen (3000);
8. 綁定監聽端口?
9. app.get(“/add.html”,(req,res)=>{
10. ? res.sendFile(“./add.html”);
11. })
nodejs? 2.4
請求方法:
get請求? app.get? 表示客戶端想要獲取服務器資源?
post請求? app.post/delete/put? 表示客戶帶要上傳 添加文件給客戶端? 相關數據在請求主體中
put更新指定的主體數據位于服務器上邊?
delete表示客戶端想要刪除服務器上邊的數據?
請求方法用于標明此次請求的目的?
瀏覽器什么方法發送請求:
get:地址欄中直接輸入? ajax? 表單提交? a標簽? 超鏈接?
? js的跳轉? src? link-href?
post:ajax? 表單
put:ajax
delete:ajax?
1.ie8? juery2以上不支持ie
2.熱部署? nodejs支持熱部署?
3.post POST? ? post盡量寫大寫?
取參數:
2.5參數?
get請求: 兩種方式
1.查詢字符串
get/user?uid=3&loc=bj? app.get(/user",(req,res)=>{
? ? req.query.uid;
query.loc
})
2.接受請求的參數?
get/book/js/60? app.get("/book/:name/:price"
req.params.name/price;
})
內部自動創建變量 一一對應?
express自動創建屬性
res.json(result);
發送json? sendFile? 發送頁面
express實例
const express=require("express");
const http= require("http");
var app=express();
var server=http.createServer(app);
server.listen(3000);
const mysql = require("mysql");
//5:?????????
var pool = mysql.createPool({
? ? host:"127.0.0.1",
? ? user:"root",
? ? password:"",
? ? database:"tmooc",
? ? port:3306,
? ? connectionLimit:5
});
app.get("/stu/:sid",(req,res)=>{
? var sid= req.params.sid;
? //res.send(id);
var sql = "SELECT * FROM stu where sid=? ";
pool.query(sql,[sid],(err,result)=>{
? ? if(err)throw err;
res.json(result);
});
})
關于http協議:
請求是客戶端發送給服務器的? 響應是服務器發送給客戶端的
發送一次請求? 只會得到一次響應
1. 請求的詳細個事
1. 請求起始行(請求方式:get沒有請求主體 post有主體 put有主體? delete head表示客戶端獲取服務器上的資源只有響應頭不要響應主體
,trace追蹤請求路徑? connection 測試連接? options保留以后使用
2.請求頭:1.host.www..tmooc.cn 客戶端告訴服務器此次請求的虛擬主機 2.connection:keep-alive? 持久鏈接? 3.cache-control緩存? 4.user-agent客戶端告訴服務器自己是什么類型? 5.每次請求都會帶上cookie? 請求主體的描述? content-length:36? 請求字節?
2響應其實行:
今天學習的內容
1:復習上一周重點;http協議
2:今天的目標
? 2.1:nodejs--express--項目(學子商城)
? nodeadmin
? ? ? ? ? ? public---保存所有靜態網頁資源(html;css;image)
? ? ? ? ? ? app.js--項目的入口程序
? ? ? ? ? ? pool.js-連接池
? node_modules/mysql+express
? 2.2:用戶管理
? 2.3:用戶列表
? ? (1)用戶分頁顯示
? ? ? app.js
? ? ? GET /users?pno=3&pageSize=10
? ? ? #參數 pno pageSize
? ? ? #sql
? ? ? ? SELECT count(uid) as c FROM xz_user? 總記錄數
? ? ? ? SELECT uid,uname,email,phone, avatar, user_name
? ? ? ? FROM xz_user
? ? ? ? LIMIT ?,?
? ? ? #json
? ? ? ? {pno:3,pageSize:10;pageCount:5,data:[]}
? ? 常見錯誤:
? ? ? 1: Error: Cannot find module 'express'
? ? ? 當前目錄或上級目中node_modules/沒有express
? ? ? node.js/day04/ node_modules{mysq;express}
? ? ? 2:
? ? (2)刪除指定用戶
? ? (3)更新指定用戶信息[密碼]
? ? (4)詳細
? 2.4:用戶檢索
? return;
??錯誤時使用? ? ? 阻止程序執行? ? ?
非阻塞? 設置progress來保證函數執行順序
靜態資源的中間件
app.user(express.static(“public”))? express
實例
http://127.0.0.12:3000/user_list.html
讀取public下邊的所有資源
pool.js 導出pool
const mysql = require("mysql");
//2:創建連接池對象
var pool = mysql.createPool({
? ? host:"127.0.0.1",
? ? user:"root",
? ? password:"",
? ? database:"xz",
? ? port:3306,
? ? connectionLimit:5
})
//3:輸出對象
module.exports =? pool;
?
app.js? nodejs創建服務器
const pool = require("./pool");
//1:加載指定模塊 http;express;pool
const http = require("http");
const express = require("express");
//2:創建express對象
var app = express();
//3:創建server對象
var server = http.createServer(app);
//4:綁定監聽端口 3000
server.listen(8888);
//4.1制定靜態資源的目錄
? ? app.use(express.static("public"));
//功能一:用戶分頁顯示
//GET /users? ? ?pno=3&pageSize=10
//? ? users.php? (req,res)=>{...}
app.get("/users",(req,res)=>{
? ? //5:接收請上請求
? ? //5.1:獲取二個參數
? ? var pno = req.query.pno;
? ? var pageSize = req.query.pageSize;
? ? //5.2:默認值 1 pageSize? 10
? ? //http=res.setHeadr()+res.write()+res.end();
? ? if(!pno){ pno = 1;}
? ? if(!pageSize){pageSize=10}
? ? //res.send(pno+"_"+pageSize);
? ? //5.3:正則表達式驗證pno pageSize
? ? var reg = /^[0-9]{1,}$/;
? ? //res.setHeader+json+write+end
? ? if(!reg.test(pno)){
? ? ? ? res.json({code:-1,msg:"頁碼格式有誤"});
? ? ? ? return;
? ? }
? ? if(!reg.test(pageSize)){
? ? ? ? res.json({code:-1,msg:"頁大小格式有誤"});
? ? ? ? return;
? ? }
? ? //結果對象
? ? var output = {pno:pno,pageSize:pageSize};
? ? var progress = 0;
? ? //5.4:創建二個sql? 總記錄數? 當前頁內容
? ? var sql = "SELECT count(uid) as c FROM xz_user";
? ? pool.query(sql,(err,result)=>{
? ? ? ? if(err)throw err;
? ? ? ? var pageCount = Math.ceil(result[0].c/pageSize);
? ? ? ? output.pageCount = pageCount;
? ? ? ? progress+=50;
? ? ? ? if(progress==100){
? ? ? ? ? ? res.json(output);
? ? ? ? }
? ? });
? ? //node.js 對占位符參數類型嚴格
? ? pno = parseInt(pno);
? ? pageSize = parseInt(pageSize);
? ? var offset = (pno-1)*pageSize;
? ? var sql = " SELECT uid,uname,phone,email";
? ? ? ? sql +=" ,avatar,user_name FROM xz_user";
? ? ? ? sql +=" LIMIT ?,?";
? ? pool.query(sql,[offset,pageSize],(err,result)=>{
? ? ? ? output.data = result;
? ? ? ? progress+=50;
? ? ? ? if(progress==100){
? ? ? ? ? ? res.json(output);
? ? ? ? }
? ? });
? ? //5.4:發送并且創建結果對象
});