nidejs基礎(chǔ)知識及服務(wù)器搭建。純干貨。抓緊收藏

圖片發(fā)自簡書App

今天學習的內(nèi)容

1:復(fù)習昨天重點

2:大魚喂小魚;首頁

? 大魚喂小魚:

? 大魚碰撞小魚,小魚吃飽,小魚身體圖片下標 = 0

? 碰撞檢測: collsion.js 大魚碰撞食物;

3:今天的目標

? 3.1:nodejs 模塊

? 遇到問題:nodejs 作者nodejs 不足

? (1)生活示例:實用主義;完美主義

? (2)招聘條件:50% >公司(技術(shù)型,互聯(lián)網(wǎng)公司)

? 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直到

? ? 看到網(wǎng)頁發(fā)生了什么?

? ? (1)操作系訪問網(wǎng)絡(luò)的DNS服務(wù)器,把域名轉(zhuǎn)ip地址

? ? (2)瀏覽器使用IP地址向淘寶發(fā)請求

? ? (3)淘寶服務(wù)器接收請求,并解析請求內(nèi)容,查詢找資源,

? ? ? 可能數(shù)據(jù)庫,構(gòu)建并返回HTTP響應(yīng)消息

? ? (4)瀏覽器接收并解析響應(yīng)消息

? ? (5)瀏覽器緩存接收響應(yīng)內(nèi)容,并解析和渲染內(nèi)容

?

? 3.4:靜態(tài)網(wǎng)頁和動態(tài)網(wǎng)頁

? 靜態(tài):網(wǎng)頁內(nèi)容任何人任何時間訪問都是不變的..

? ? ? ? HTML/CSS/JS/Flash/視頻音頻

? 動態(tài):網(wǎng)頁內(nèi)容不同人在不同時間訪問可能是不同的..

? ? ? ? DB/JSP/PHP/ASP/Node.JS

? JSP=html+java? 功能強大可靠,適合大型企業(yè)項目(阿里;銀行)

? 2003-2004 淘寶[php+mysql];->mysql(oracle)->php->java->服務(wù)器

? ? ? ? ? ? ->小型機->oracle->{服務(wù)器+java+OC(mysql)}--卡車

? PHP=html+php? 簡單易用:適合互聯(lián)網(wǎng)項目(論壇)? --家用轎

? https://cn.wordpress.org/

? ASP.NET=html+c#? 易用;貴點

? Node.js=html+js? 性能好--(跑車)

?

node.js適合項目(io密集型) node.js 不適合項目(cpu密集型)

輸入輸出[查詢;添加] 滴滴打車;天氣預(yù)報...

? ? ? ?

?

? 3.5:Node.JS

? Node.js不是js,是一種運行在服務(wù)器端開發(fā)平臺(開發(fā)語言用js),

? 歷史上第一次有一種語言可以通吃前后臺.

? https://npm.taobao.org/mirrors/node? 淘寶鏡像

?

? 3.6:Node.JS 運行模式

? (1)交互模式---一般測試

? ? 輸入一行代碼執(zhí)行一行

? ? 在命令行狀態(tài)下輸入

? ? node 回車

? ? 退出 ctrl+c? 二次

? (2)腳本模式--正式項目中使用方式

? ? 把要執(zhí)行的所有語句編寫在一個文本文件中(后綴名任意,沒有也行),一次性提交node解析器執(zhí)行

? ? node? x.js? 回車

? 解釋器: C:\Program Files\nodejs\node.exe

? 練習:02_node.js 打印出九九乘法表,

? 以腳本模式在ws運行

? 3.7:Node.JS 如何自學一門新語言--Node.js

? (1)了解背景

? ? --百度百科 Node.JS? [事件驅(qū)動,非阻塞I/O 模型]

? (2)搭建開發(fā)環(huán)境,編寫Hello World

? (3)數(shù)據(jù)類型

? ?

前端js數(shù)據(jù)類型

1:原始[基本]? ? number;string;boolean;null;undefined

2:引用/對象類型

? ? ES對象:Math;Date;RegExp;Object;Function;Error.....

? ? BOM/DOM對象:window;docuemnt;screen;event...

? ? 自定義:{}

后端Node.js 數(shù)據(jù)類型

1:原始[基本]? number;string;boolean;null;undefined

2:引用/對象類型

? ? ES對象:Math;Date;RegExp;Object;Function;Error.....

? ? 自定義:{}

? (4)變量和常量

? node js 提供了10幾萬·個專用對象?

運算符:邏輯運算·? 算術(shù)運算? 三目運算? 位運算? 副職運算? typeof? instanceof?

邏輯結(jié)構(gòu):循環(huán)結(jié)構(gòu)? while do while? for? ? for()? 選擇結(jié)構(gòu)? if else? switch case

聲明一個保存五個學生的數(shù)學;

7.通用小程序

? nodejs 模塊

modal模態(tài)框

model模型

module模塊? 是nodejs特有? 是一個web項目中的功能分為不同的模塊

每一個模塊都是一個獨立的構(gòu)造函數(shù)? 解釋器都會自動為js文件添加如下代碼

? (function(exports,require,module,__filename,__dirname){

expoirt{}用于聲明向外部導出自己的成員? 使用exports對象? 對外導出或者公開自己的內(nèi)部成員供其他成員使用?

require:fn用于導入其他模塊? 并且創(chuàng)建制定模塊對象? 創(chuàng)建一個模塊的實力? 模塊名稱就是模塊的文件名

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

二者都可以用于指向外界導出自己的內(nèi)部成員

真正導出數(shù)據(jù)modelu.export

node.js底層代碼? exports=module.exports

如果導出一個完整的對象只能是m e? ? 只導出屬性 函數(shù)或變量? 對象只能用me導出?

最好都用? module.exports? ? ?

編寫數(shù)組模塊

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搭建服務(wù)器

1. 引入nodejs核心模塊? http

2. const http=require(“http”);

3. 創(chuàng)建一個服務(wù)器實例

4. let sever=http.createSever((req,res)=>{res.end(“it works.”);});

nodejs的全局模塊? global? 她的使用不需要引入

dirname? 當前文件所在目錄的絕對路徑?

全局對象console?

全局對象? process? ? thread? 線程執(zhí)行的最小單位

process.kill()結(jié)束某一個軟件的運行?

今天學習的內(nèi)容

1:復(fù)習昨天的內(nèi)容

2:首頁

3:今天的目標

? 3.1:node.js? 模塊分類(自定義模塊)

? (1)官方提供模塊

? (2)第三方模塊,單獨下載 www.npmjs.com

? (3)自定義模塊

? ? #文件模塊: 創(chuàng)建一個js文件,如 m3.js 導出需要公開數(shù)據(jù)

? ? ? ? ? ? ? ? 其它模塊 require("./m3");模塊

? ? #目錄模塊:

? ? ? 方式一:創(chuàng)建一個目錄,假設(shè)名為 m4,其中創(chuàng)建名為index.js

? ? ? ? ? ? 文件,導出需要公開的數(shù)據(jù),其它模塊引用

? ? ? ? ? ? require("./m4");

? ? ? 方式二:創(chuàng)建一個目錄,假設(shè)名為 m5,其中創(chuàng)建名為 5.js

? ? ? ? ? ? 創(chuàng)建package.json main指定啟動文件 5.js

? ? ? 方式三:創(chuàng)建一個目錄,必須名為 node_modules,

? ? ? ? ? ? 其中再創(chuàng)建一個目錄,假設(shè) m6 ,其中創(chuàng)建

? ? ? ? ? ? package.json描述文件,其中聲明main屬性

? ? ? ? ? ? 指定默認執(zhí)行js文件,如 6.js ,其中導出需要

? ? ? ? ? ? 公共數(shù)據(jù),其它模塊require("m6");

練習:使用第三種方式,創(chuàng)建二個目錄模塊circle;rectangle

都對外公開兩個方法

size()? ? ? 返回指定圖形面積

perimeter();返回指定圖形周長

最后在最外層模塊,引入上述兩個模塊

circle.size(r) circle.perimeter(r)

r.size(w,h);? r.perimeter(w,h);

常見錯誤:

1: Error: Cannot find module './m4'? 目錄結(jié)構(gòu)錯誤

? 3.2:node.js? --- 特性(事件驅(qū)動; 非阻塞IO)

? ? php? ? 阻塞? IO {有順序;效率差}

? ? nodejs 非阻塞IO{無序;效率高}

? 3.3:node.js? npm (Node Package Mangaer)

? ? node.js的第三方模塊/包管理器,可以用于下載;更新;刪除;

? ? 維護包依賴關(guān)系的工具

? ? npm 工具默認www.npmjs.com網(wǎng)站下載所需的第三方模塊

? ? 包

? ? 使用npm工具下載一個新的軟件包

? ? npm install? 包名? ? 下載

? ? npm uninstall 包名? ? 刪除

? ? 示例:

? ? nodejs 下載nodejs mysql驅(qū)動程序(第三方模塊)

? ? 1:查找 mysql 模塊? ? ? www.npmjs.com? ? [mysql]

? ? 2:npm install mysql

? ? 淘寶:開發(fā)工具 cnpm

? ? cnpm install mysql? ? [99.99%]

? 3.3:node.js? 官方模塊

? querystring? 請求http中的查詢字符串? var obj=qs.parse(str);將查詢字符串轉(zhuǎn)換為js對象? ? ? qs.stringfy(obj)將對秀昂轉(zhuǎn)換為 js的字符串

eg:

//用;來加載querystring模塊? 官方提供好的模塊要用常量? 只是使用? 不修改

? ? //global buffer不用require? 優(yōu)先級別較高

const qs=require("querystring");

//2。創(chuàng)建字符串

var str="uname=tom&ypwd=123&page=3";

//3將字符串轉(zhuǎn)換為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轉(zhuǎn)對象

var obj=url.parse(str,true)將其中的查詢字符串也轉(zhuǎn)換為對象;

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? 緩沖區(qū)? 內(nèi)存是速度介于 硬盤和cpu之間? 本質(zhì)上是內(nèi)存的一塊區(qū)域? 用于暫時存儲? 數(shù)據(jù)? 該區(qū)域? 叫做緩存區(qū)?

1. 創(chuàng)建緩沖區(qū)? var buffer=Buffer.alloc(1024);

2. 創(chuàng)建一個數(shù)字數(shù)組的緩沖區(qū)

3. ? var buffer1=Buffer.from([1,2,3,4])

4. ? 創(chuàng)建一個字符串

5. var buffer2=Buffer.from(“abc”)

6. 緩沖區(qū)? 將緩沖區(qū)轉(zhuǎn)換為字符串?

7. //創(chuàng)建? 大小為2k的緩沖區(qū)? 不用requier? 優(yōu)先級較高

? ? var buffer=Buffer.alloc(1024*2);

console.log(buffer.length);

//數(shù)組

? var buf1=Buffer.from([1,2,3,4]);

console.log(buf1);

//字符串

var buf2=Buffer.from("abhsjsj");

console.log(buf2);

//字符串緩沖區(qū) 轉(zhuǎn)換為字符串

var str=buf2.toString();

console.log(str);

8.?

? 3.3:node.js? 官方模塊

? 文件讀寫模塊? 增刪改查

1. 阻塞方案? 有順序 效率低

阻塞的向文件中? var data=fs.readFileSync(“文件名”);

寫內(nèi)容? fs.writeFileSync(文件名,內(nèi)容) ;先將原有的內(nèi)容刪除新內(nèi)容

//阻塞方式? 讀取文件? public/。。。。index.html? main.html

//加載fs模塊

var fs=require("fs")

//創(chuàng)建兩個變量? 保存名稱

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");

//創(chuàng)建二個變量保存文件名 文件不存在自動創(chuàng)建? 文件夾不存在就直接報錯

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";

//創(chuàng)建二個變量保存文件名 文件不存在自動創(chuàng)建? 文件夾不存在就直接報錯

var data=fs.readFileSync(f1);

fs.writeFileSync(f2,data);

console.log(data.toString());

fs.appendFileSync(f2,data);

文件中? 追加內(nèi)容? fs.appendFileSync(文件名 ,內(nèi)容)

2. 非阻塞方案? 無順序? 效率高

不好控制? fs.readFile(fileNmae,(err,data)=>{})? 回掉函數(shù)文件讀取之后? data就是內(nèi)容? 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("讀取結(jié)束");

})

console.log(2);

console.log(3);

console.log(4);

回調(diào)函數(shù)參數(shù)的順序不能變;

寫入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協(xié)議客戶端程序一? 服務(wù)器程序;

//創(chuàng)建服務(wù)器對象

//創(chuàng)建服務(wù)器對象

var http=require("http");

? ? var server=http.createServer();

//綁定端口? 端口? 1-65535;四個6不行? 8888可以

server.listen(8888);

//注冊事件? 客戶端請求事件、 req請求對象? res響應(yīng)對象

server.on("request",(req,res)=>{

? ? console.log("nodejs服務(wù)器端接收到一個請求");

? ? //解析客戶端發(fā)來的請求消息

? ? console.log(req.method);//請求方法

? ? console.log(req.url);//請求的url

? ? console.log(req.httpVersion);//http協(xié)議版本

? ? res.write("hello world");

? ? res.end();

})

//響應(yīng)客戶的消息? ? res.write()向客戶端發(fā)送字符串? res.send()響應(yīng)結(jié)束;

? 作業(yè)1:大小小,小小大

? 大魚喂小魚,金色光環(huán)特效,漂浮生物

//1:加載http模塊

const http = require("http");

const fs = require("fs");

const url = require("url");

//2:創(chuàng)建http服務(wù)器

var server = http.createServer();

//3:綁定監(jiān)聽端口

server.listen(3000);

//4:注冊事件 request

server.on("request",(req,res)=>{

? ? console.log("node.js 服務(wù)器端接收請請求");

? ? //解析客戶端發(fā)來的請求消息

? ? //console.log(req.method); //GET POST

? ? //console.log(req.url);

? ? //console.log(req.httpVersion); //http協(xié)議

? ? 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文件內(nèi)容返回給客戶端

? ? fs.readFile(f,(err,data)=>{

? ? ? ? if(err)throw err;

? ? ? ? res.write(data);

? ? ? ? res.end();

? ? });

});

req 請求對象? ?

res.setHeader("Content-Type","text/html;charset=UTF-8");//設(shè)置字符集編碼?

res.write("<h1>打飛機</h1>>");

res.end()

實現(xiàn)注冊

const http = require("http");

const fs = require("fs");

const url = require("url");

//2:創(chuàng)建http服務(wù)器

var server = http.createServer();

//3:綁定監(jiān)聽端口

server.listen(3000);

//4:注冊事件 request

server.on("request",(req,res)=>{

? ? console.log(res.url);

? ? console.log("node.js 服務(wù)器端接收請請求");

? ? 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文件內(nèi)容返回給客戶端

});

數(shù)據(jù)庫的種類

1. 關(guān)系型數(shù)據(jù)庫

mysql 單表500萬 100列行 opracle sql server? mysql一秒25次?

mogodb redis? 20000以上 memcache? nosql 你不僅僅是sql

redis高并發(fā)? ? HBASE? 1000萬列

2. 非關(guān)系型的數(shù)據(jù)庫

3.

sql語句的分類·

DDL定義語言 create drop alert

DML操作語句insert update、 delete

DQL查詢語句 select

DCL 數(shù)據(jù)的控制語句 授權(quán) 恢復(fù)? 回收權(quán)利 recover? grand‘?

Nodejs 訪問·mysql的服務(wù)器

:安裝mysql‘的驅(qū)動程序

? 為了精簡nodejs的解釋器? 官方?jīng)]有提供訪問任何數(shù)據(jù)庫相關(guān)的抹開I 必須要使用npm工具下載? npm。Js?

三部? 創(chuàng)建數(shù)據(jù)庫連接?

const mysql=require(“mysql:);

var conn=mysql.createConnection({})

3. 發(fā)送語句給哦數(shù)據(jù)庫執(zhí)行

4. conn.query(“sql”,(err,result){})

5. 關(guān)閉連接

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'))";

//創(chuàng)建sql語句? 并發(fā)送

conn.query(sql,(err,result)=>{

? ? if(err){throw err}

? ? console.log(result);

? ? conn.end();

})

7. 判定添加成功的條件

8. if(result.affectedRows>0){

? ? console.log("添加成功");

}

mysql模塊的使用? 知道? 網(wǎng)絡(luò)中常見的攻擊手段? sql注入? 利用規(guī)則將危險代碼? 加入到sql語句里邊?

占位符技術(shù)解決問題?

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'))";

//創(chuàng)建sql語句? 并發(fā)送

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('失敗');

}

})

創(chuàng)建鏈接池

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:綁定監(jiān)聽端口

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>數(shù)據(jù)格式有誤 請檢查!</h1>");

? ? ? ? ? ? res.end();

? ? ? ? }

? ? }

? ? else if(path=="/add.html"){

? ? ? fs.readFile("./add.html",(err,data)=>{

? ? ? ? ? if(err){throw err}

? ? ? ? ? res.write(data);

? ? ? ? ? res.end();

? ? ? })

? ? }

})

? js將數(shù)組轉(zhuǎn)換為? json字符串

var json=JSON .stringfy(result)

http開發(fā)效率有點低?

第三方模塊 express

簡化版本的http;

如果使用官方的http模塊? 但是這個??焓且粋€非常底層的模塊? 推薦使用? http模塊進一步封裝的 簡化模塊?

該模塊的指甲哦顧問景象站http://www.expressjs.com.cn

1. 記載模塊

2. var express=require(“express”)

3. var app=express();

4. 創(chuàng)建express對象

5. var server=tttp.CreateServer(app);

6. 創(chuàng)建服務(wù)器對象?

7. server.listen (3000);

8. 綁定監(jiān)聽端口?

9. app.get(“/add.html”,(req,res)=>{

10. ? res.sendFile(“./add.html”);

11. })

nodejs? 2.4

請求方法:

get請求? app.get? 表示客戶端想要獲取服務(wù)器資源?

post請求? app.post/delete/put? 表示客戶帶要上傳 添加文件給客戶端? 相關(guān)數(shù)據(jù)在請求主體中

put更新指定的主體數(shù)據(jù)位于服務(wù)器上邊?

delete表示客戶端想要刪除服務(wù)器上邊的數(shù)據(jù)?

請求方法用于標明此次請求的目的?

瀏覽器什么方法發(fā)送請求:

get:地址欄中直接輸入? ajax? 表單提交? a標簽? 超鏈接?

? js的跳轉(zhuǎn)? src? link-href?

post:ajax? 表單

put:ajax

delete:ajax?

1.ie8? juery2以上不支持ie

2.熱部署? nodejs支持熱部署?

3.post POST? ? post盡量寫大寫?

取參數(shù):

2.5參數(shù)?

get請求: 兩種方式

1.查詢字符串

get/user?uid=3&loc=bj? app.get(/user",(req,res)=>{

? ? req.query.uid;

query.loc

})

2.接受請求的參數(shù)?

get/book/js/60? app.get("/book/:name/:price"

req.params.name/price;

})

內(nèi)部自動創(chuàng)建變量 一一對應(yīng)?

express自動創(chuàng)建屬性

res.json(result);

發(fā)送json? sendFile? 發(fā)送頁面

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);

});

})

關(guān)于http協(xié)議:

請求是客戶端發(fā)送給服務(wù)器的? 響應(yīng)是服務(wù)器發(fā)送給客戶端的

發(fā)送一次請求? 只會得到一次響應(yīng)

1. 請求的詳細個事

1. 請求起始行(請求方式:get沒有請求主體 post有主體 put有主體? delete head表示客戶端獲取服務(wù)器上的資源只有響應(yīng)頭不要響應(yīng)主體

,trace追蹤請求路徑? connection 測試連接? options保留以后使用

2.請求頭:1.host.www..tmooc.cn 客戶端告訴服務(wù)器此次請求的虛擬主機 2.connection:keep-alive? 持久鏈接? 3.cache-control緩存? 4.user-agent客戶端告訴服務(wù)器自己是什么類型? 5.每次請求都會帶上cookie? 請求主體的描述? content-length:36? 請求字節(jié)?

2響應(yīng)其實行:

今天學習的內(nèi)容

1:復(fù)習上一周重點;http協(xié)議

2:今天的目標

? 2.1:nodejs--express--項目(學子商城)

? nodeadmin

? ? ? ? ? ? public---保存所有靜態(tài)網(wǎng)頁資源(html;css;image)

? ? ? ? ? ? app.js--項目的入口程序

? ? ? ? ? ? pool.js-連接池

? node_modules/mysql+express

? 2.2:用戶管理

? 2.3:用戶列表

? ? (1)用戶分頁顯示

? ? ? app.js

? ? ? GET /users?pno=3&pageSize=10

? ? ? #參數(shù) pno pageSize

? ? ? #sql

? ? ? ? SELECT count(uid) as c FROM xz_user? 總記錄數(shù)

? ? ? ? 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;

??錯誤時使用? ? ? 阻止程序執(zhí)行? ? ?

非阻塞? 設(shè)置progress來保證函數(shù)執(zhí)行順序

靜態(tài)資源的中間件

app.user(express.static(“public”))? express

實例

http://127.0.0.12:3000/user_list.html

讀取public下邊的所有資源

pool.js 導出pool

const mysql = require("mysql");

//2:創(chuàng)建連接池對象

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創(chuàng)建服務(wù)器

const pool = require("./pool");

//1:加載指定模塊 http;express;pool

const http = require("http");

const express = require("express");

//2:創(chuàng)建express對象

var app = express();

//3:創(chuàng)建server對象

var server = http.createServer(app);

//4:綁定監(jiān)聽端口 3000

server.listen(8888);

//4.1制定靜態(tài)資源的目錄

? ? app.use(express.static("public"));

//功能一:用戶分頁顯示

//GET /users? ? ?pno=3&pageSize=10

//? ? users.php? (req,res)=>{...}

app.get("/users",(req,res)=>{

? ? //5:接收請上請求

? ? //5.1:獲取二個參數(shù)

? ? 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;

? ? }

? ? //結(jié)果對象

? ? var output = {pno:pno,pageSize:pageSize};

? ? var progress = 0;

? ? //5.4:創(chuàng)建二個sql? 總記錄數(shù)? 當前頁內(nèi)容

? ? 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 對占位符參數(shù)類型嚴格

? ? 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:發(fā)送并且創(chuàng)建結(jié)果對象

});


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容