nidejs基礎知識及服務器搭建。純干貨。抓緊收藏

圖片發自簡書App

今天學習的內容

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:發送并且創建結果對象

});


?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容