欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)激活碼778899分享:node.js

柚子快報(bào)激活碼778899分享:node.js

http://yzkb.51969.com/

目錄

一、Buffer

1、創(chuàng)建

2、與字符串的轉(zhuǎn)化

3、讀寫

二、fs模塊

1、文件寫入

(1)、異步寫入

(2)、同步寫入

(3)、追加寫入

(4)、流式寫入

2、文件讀取

(1)、異步讀取

(2)、同步讀取

(3)、流式讀取

3、文件移動(dòng)和重命名

4、文件刪除

5、文件夾操作

(1)、創(chuàng)建

(2)、讀取

(3)、刪除

6、查看資源狀態(tài)

7、相對(duì)路徑問(wèn)題

8、__dirname

三、path模塊

四、HTTP模塊

1、創(chuàng)建HTTP服務(wù)

2、獲取HTTP請(qǐng)求的請(qǐng)求報(bào)文

3、獲取請(qǐng)求路徑與查詢字符串

(1)、方式一

(2)、方式二

?編輯

(3)、練習(xí)

4、設(shè)置 HTTP 響應(yīng)報(bào)文

(1)、使用

?(2)、練習(xí)

5、靜態(tài)服務(wù)搭建

6、網(wǎng)頁(yè)中的url

(1)、絕對(duì)路徑

(2)、相對(duì)路徑

7、設(shè)置資源類型(mime類型)

8、解決亂碼問(wèn)題

9、錯(cuò)誤處理

10、GET和POST

五、node.js模塊化

1、模塊暴露數(shù)據(jù)/導(dǎo)出

2、導(dǎo)入模塊

3、導(dǎo)入模塊的基本流程

六、包管理工具

1、npm基本使用

(1)、初始化包

(2)、搜索包

(3)、安裝包

(4)、生產(chǎn)依賴與開發(fā)依賴

(5)、全局安裝

(6)、修改 windows 執(zhí)行策略

(7)、安裝包依賴

(8)、安裝指定版本的包

(9)、刪除依賴

(10) 、配置命令別名

(11)、npm安裝淘寶鏡像?

2、cnmp

3、yarn

4、創(chuàng)建、發(fā)布、更新、刪除包

七、nvm

八、express

1、快速上手

2、express路由

(1)、簡(jiǎn)單使用

(2)、獲取請(qǐng)求參數(shù)

(3)、獲取路由參數(shù)

3、express 響應(yīng)設(shè)置

4、express 中間件

(1)、全局中間件

(2)、路由中間件

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

(4)、獲取請(qǐng)求體數(shù)據(jù) body-parser

5、防盜鏈

6、路由模塊化

7、模板引擎(ejs)

(1)、快速上手

(2)、列表渲染

(3)、條件渲染

(4)、在express中使用ejs

(5)、express-generator

8、文件上傳

(1)、前端上傳

(2)、出路文件上傳請(qǐng)求

九、express中的會(huì)話控制

1、cookie

2、session

3、session 和 cookie 的區(qū)別 ?

4、token(JWT)

十、本地域名

一、Buffer

1、創(chuàng)建

2、與字符串的轉(zhuǎn)化

3、讀寫

二、fs模塊

1、文件寫入

(1)、異步寫入

// require 是 Node.js 環(huán)境中的'全局'變量,用來(lái)導(dǎo)入模塊

const fs = require('fs');

//將 『三人行,必有我?guī)熝伞!?寫入到當(dāng)前文件夾下的『座右銘.txt』文件中

fs.writeFile('./座右銘.txt', '三人行,必有我?guī)熝伞?, err => {

//如果寫入失敗,則回調(diào)函數(shù)調(diào)用時(shí),會(huì)傳入錯(cuò)誤對(duì)象,如寫入成功,會(huì)傳入 null

if(err){

console.log(err);

return;

}

console.log('寫入成功');

});

(2)、同步寫入

(3)、追加寫入

換行\(zhòng)r\n

fs.appendFile('./座右銘.txt','擇其善者而從之,其不善者而改之。', err => {

if(err) throw err;

console.log('追加成功')

});

fs.appendFileSync('./座右銘.txt','\r\n溫故而知新, 可以為師矣');

用?writeFile實(shí)現(xiàn)追加寫入

(4)、流式寫入

let ws = fs.createWriteStream('./觀書有感.txt');

ws.write('半畝方塘一鑒開\r\n');

ws.write('天光云影共徘徊\r\n');

ws.write('問(wèn)渠那得清如許\r\n');

ws.write('為有源頭活水來(lái)\r\n');

ws.end();

2、文件讀取

(1)、異步讀取

//導(dǎo)入 fs 模塊

const fs = require('fs');

fs.readFile('./座右銘.txt', (err, data) => {

if(err) throw err;

console.log(data);

});

fs.readFile('./座右銘.txt', 'utf-8',(err, data) => {

if(err) throw err;

console.log(data);

});

(2)、同步讀取

let data = fs.readFileSync('./座右銘.txt');

let data2 = fs.readFileSync('./座右銘.txt', 'utf-8');

(3)、流式讀取

語(yǔ)法:

fs.createReadStream(path[, options])

參數(shù)說(shuō)明:

path 文件路徑

options 選項(xiàng)配置( 可選 )

返回值:

Object

//創(chuàng)建讀取流對(duì)象

let rs = fs.createReadStream('./觀書有感.txt');

//每次取出 64k 數(shù)據(jù)后執(zhí)行一次 data 回調(diào)

rs.on('data', data => {

console.log(data);

console.log(data.length);

});

//讀取完畢后, 執(zhí)行 end 回調(diào)

rs.on('end', () => {

console.log('讀取完成')

})

3、文件移動(dòng)和重命名

fs.rename('./觀書有感.txt', './論語(yǔ)/觀書有感.txt', (err) =>{

if(err) throw err;

console.log('移動(dòng)完成')

});

fs.renameSync('./座右銘.txt', './論語(yǔ)/我的座右銘.txt');

4、文件刪除

const fs = require('fs');

fs.unlink('./test.txt', err => {

if(err) throw err;

console.log('刪除成功');

});

fs.unlinkSync('./test2.txt');

或使用rm、rmSync進(jìn)行刪除

5、文件夾操作

(1)、創(chuàng)建

fs.mkdir('./page', err => {

if(err) throw err;

console.log('創(chuàng)建成功');

});

//遞歸異步創(chuàng)建

fs.mkdir('./1/2/3', {recursive: true}, err => {

if(err) throw err;

console.log('遞歸創(chuàng)建成功');

});

//遞歸同步創(chuàng)建文件夾

fs.mkdirSync('./x/y/z', {recursive: true});

(2)、讀取

//異步讀取

fs.readdir('./論語(yǔ)', (err, data) => {

if(err) throw err;

console.log(data);

});

//同步讀取

let data = fs.readdirSync('./論語(yǔ)');

console.log(data);

(3)、刪除

//異步刪除文件夾

fs.rmdir('./page', err => {

if(err) throw err;

console.log('刪除成功');

});

//異步遞歸刪除文件夾

fs.rmdir('./1', {recursive: true}, err => {

if(err) {

console.log(err);

}

console.log('遞歸刪除')

});

//同步遞歸刪除文件夾

fs.rmdirSync('./x', {recursive: true})

?遞歸刪除建議使用rm

//異步遞歸刪除文件夾(不推薦)

fs.rm('./1', {recursive: true}, err => {

if(err) {

console.log(err);

}

console.log('遞歸刪除')

});

6、查看資源狀態(tài)

//異步獲取狀態(tài)

fs.stat('./data.txt', (err, data) => {

if(err) throw err;

console.log(data);

});

//同步獲取狀態(tài)

let data = fs.statSync('./data.txt');

結(jié)果值對(duì)象結(jié)構(gòu):

size 文件體積 birthtime 創(chuàng)建時(shí)間 mtime 最后修改時(shí)間 isFile 檢測(cè)是否為文件 isDirectory 檢測(cè)是否為文件夾 ....

7、相對(duì)路徑問(wèn)題

8、__dirname

__dirname是文件夾的絕對(duì)路徑,__filename是文件的絕對(duì)路徑?

三、path模塊

const path = require('path');

//獲取路徑分隔符

console.log(path.sep);

//拼接絕對(duì)路徑

console.log(path.resolve(__dirname, 'test'));

//解析路徑

let pathname = 'D:/program file/nodejs/node.exe';

console.log(path.parse(pathname));

//獲取路徑基礎(chǔ)名稱

console.log(path.basename(pathname))

//獲取路徑的目錄名

console.log(path.dirname(pathname));

//獲取路徑的擴(kuò)展名

console.log(path.extname(pathname));

四、HTTP模塊

1、創(chuàng)建HTTP服務(wù)

//1. 導(dǎo)入 http 模塊

const http = require('http');

//2. 創(chuàng)建服務(wù)對(duì)象 create 創(chuàng)建 server 服務(wù)

// request 意為請(qǐng)求. 是對(duì)請(qǐng)求報(bào)文的封裝對(duì)象, 通過(guò) request 對(duì)象可以獲得請(qǐng)求報(bào)文的數(shù)據(jù)

// response 意為響應(yīng). 是對(duì)響應(yīng)報(bào)文的封裝對(duì)象, 通過(guò) response 對(duì)象可以設(shè)置響應(yīng)報(bào)文

const server = http.createServer((request, response) => {

response.end('Hello HTTP server'); //設(shè)置響應(yīng)體并結(jié)束響應(yīng)

});

//3. 監(jiān)聽端口, 啟動(dòng)服務(wù)

server.listen(9000, () => {

console.log('服務(wù)已經(jīng)啟動(dòng), 端口 9000 監(jiān)聽中...');

}); //回調(diào)函數(shù)在服務(wù)啟動(dòng)成功之后調(diào)用

http.createServer 里的回調(diào)函數(shù)的執(zhí)行時(shí)機(jī): 當(dāng)接收到 HTTP 請(qǐng)求的時(shí)候,就會(huì)執(zhí)行?

1.

命令行

ctrl + c

停止服務(wù)

2.

當(dāng)服務(wù)啟動(dòng)后,更新代碼

必須重啟服務(wù)才能生效

3.

響應(yīng)內(nèi)容中文亂碼的解決辦法

response.setHeader('content-type','text/html;charset=utf-8');

4.

端口號(hào)被占用

Error: listen EADDRINUSE: address already in use :::9000

1

)關(guān)閉當(dāng)前正在運(yùn)行監(jiān)聽端口的服務(wù) (

使用較多

2

)修改其他端口號(hào)

5. HTTP

協(xié)議默認(rèn)端口是

80

。

HTTPS

協(xié)議的默認(rèn)端口是

443, HTTP

服務(wù)開發(fā)常用端口有

3000

,

8080

8090

,

9000

2、獲取HTTP請(qǐng)求的請(qǐng)求報(bào)文

注意事項(xiàng):

1. request.url

只能獲取路徑以及查詢字符串,無(wú)法獲取

URL

中的域名以及協(xié)議的內(nèi)容

2. request.headers

將請(qǐng)求信息轉(zhuǎn)化成一個(gè)對(duì)象,并將屬性名都轉(zhuǎn)化成了『小寫』

3.

關(guān)于路徑:如果訪問(wèn)網(wǎng)站的時(shí)候,只填寫了

IP

地址或者是域名信息,此時(shí)請(qǐng)求的路徑為『

/

4.

關(guān)于

favicon.ico

:這個(gè)請(qǐng)求是屬于瀏覽器自動(dòng)發(fā)送的請(qǐng)求

3、獲取請(qǐng)求路徑與查詢字符串

(1)、方式一

(2)、方式二

(3)、練習(xí)

//1、引入http模塊

const http = require("http");

//2、建立服務(wù)

const server = http.createServer((request,response)=>{

let {url,method} = request; //對(duì)象的解構(gòu)賦值

//設(shè)置響應(yīng)頭信息

//解決中文亂碼

response.setHeader("Content-Type","text/html;charset=utf-8")

if(url == "/register" && method == "GET"){

response.end("注冊(cè)頁(yè)面");

}else if(url=="/login" && method == "GET"){

response.end("登錄頁(yè)面");

}else{

response.end("

404 Not Found

")

}

})

//3、監(jiān)聽端口

server.listen(8000,()=>{

console.log('服務(wù)啟動(dòng)中....');

})

4、設(shè)置 HTTP 響應(yīng)報(bào)文

(1)、使用

write 和 end 的兩種使用情況:

//1. write 和 end 的結(jié)合使用 響應(yīng)體相對(duì)分散

response.write('xx');

response.write('xx');

response.write('xx');

response.end(); //每一個(gè)請(qǐng)求,在處理的時(shí)候必須要執(zhí)行 end 方法的

//2. 單獨(dú)使用 end 方法 響應(yīng)體相對(duì)集中

response.end('xxx');

?(2)、練習(xí)

將css文件和js文件分開寫,代碼優(yōu)化

5、靜態(tài)服務(wù)搭建

6、網(wǎng)頁(yè)中的url

(1)、絕對(duì)路徑

(2)、相對(duì)路徑

較少使用

7、設(shè)置資源類型(mime類型)

不設(shè)置content-type瀏覽器也會(huì)自動(dòng)推斷類型,寫上更規(guī)范?

?

8、解決亂碼問(wèn)題

一般只給html文件設(shè)置字符集,其他的資源會(huì)根據(jù)引用它的html文件的字符集進(jìn)行解析

content-type中的字符集優(yōu)先級(jí)該與html中的meta標(biāo)簽的字符集

9、錯(cuò)誤處理

10、GET和POST

五、node.js模塊化

1、模塊暴露數(shù)據(jù)/導(dǎo)出

2、導(dǎo)入模塊

const test = require('./me.js');

3、導(dǎo)入模塊的基本流程

1.

將相對(duì)路徑轉(zhuǎn)為絕對(duì)路徑,定位目標(biāo)文件

2.

緩存檢測(cè)

3.

讀取目標(biāo)文件代碼

4.

包裹為一個(gè)函數(shù)并執(zhí)行(自執(zhí)行函數(shù))。通過(guò)

arguments.callee.toString()

查看自執(zhí)行函數(shù)

5.

緩存模塊的值

6.

返回

module.exports

的值

六、包管理工具

1、npm基本使用

(1)、初始化包

npm init

(2)、搜索包

(3)、安裝包

# 格式

npm install <包名>

npm i <包名>

(4)、生產(chǎn)依賴與開發(fā)依賴

(5)、全局安裝

npm i -g 包名

(6)、修改 windows 執(zhí)行策略

2. 鍵入命令 set-ExecutionPolicy remoteSigned

3.

鍵入

A

然后敲回車

?

4.

如果不生效,可以嘗試重啟

vscode

(7)、安裝包依賴

npm i

(8)、安裝指定版本的包

## 格式

npm i <包名@版本號(hào)>

## 示例

npm i jquery@1.11.2

(9)、刪除依賴

## 局部刪除

npm remove uniq

npm r uniq

## 全局刪除

npm remove -g nodemon

(10) 、配置命令別名

通過(guò)配置命令別名可以更簡(jiǎn)單的執(zhí)行命令

配置

package.json

中的

scripts

屬性

配置完成之后,可以使用別名執(zhí)行命令 ?

npm run server

npm run start

(11)、npm安裝淘寶鏡像?

方式一

npm config set registry https://registry.npmmirror.com/

//目前是這個(gè)鏡像

方式二

npm i -g nrm 可能報(bào)錯(cuò),指定版本npm install -g nrm open@8.4.2 --save

nrm use taobao

npm config list

?nrm ls可以查看支持的鏡像

2、cnmp

3、yarn

4、創(chuàng)建、發(fā)布、更新、刪除包

?

七、nvm

命令

說(shuō)明

nvm list available

顯示所有可以下載的

Node.js

版本

nvm list

顯示已安裝的版本

nvm install 18.12.1

安裝

18.12.1

版本的

Node.js

nvm install latest

安裝最新版的

Node.js

nvm uninstall 18.12.1

刪除某個(gè)版本的

Node.js

nvm use 18.12.1

切換

18.12.1

Node.js

八、express

1、快速上手

npm init

npm i express

//1. 導(dǎo)入 express

const express = require('express');

//2. 創(chuàng)建應(yīng)用對(duì)象

const app = express();

//3. 創(chuàng)建路由規(guī)則

app.get('/home', (req, res) => {

res.end('hello express server');

});

//4. 監(jiān)聽端口 啟動(dòng)服務(wù)

app.listen(3000, () => {

console.log('服務(wù)已經(jīng)啟動(dòng), 端口監(jiān)聽為 3000...');

});

2、express路由

(1)、簡(jiǎn)單使用

app.(path,callback)

//導(dǎo)入 express

const express = require('express');

//創(chuàng)建應(yīng)用對(duì)象

const app = express();

//創(chuàng)建 get 路由

app.get('/home', (req, res) => {

res.send('網(wǎng)站首頁(yè)');

});

//首頁(yè)路由

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

res.send('我才是真正的首頁(yè)');

});

//創(chuàng)建 post 路由

app.post('/login', (req, res) => {

res.send('登錄成功');

});

//匹配所有的請(qǐng)求方法

app.all('/search', (req, res) => {

res.send('1 秒鐘為您找到相關(guān)結(jié)果約 100,000,000 個(gè)');

});

//自定義 404 路由

app.all("*", (req, res) => {

res.send('

404 Not Found

')

});

//監(jiān)聽端口 啟動(dòng)服務(wù)

app.listen(3000, () =>{

console.log('服務(wù)已經(jīng)啟動(dòng), 端口監(jiān)聽為 3000');

});

(2)、獲取請(qǐng)求參數(shù)

//導(dǎo)入 express

const express = require('express');

//創(chuàng)建應(yīng)用對(duì)象

const app = express();

//獲取請(qǐng)求的路由規(guī)則

app.get('/request', (req, res) => {

//1. 獲取報(bào)文的方式與原生 HTTP 獲取方式是兼容的

console.log(req.method);

//GET

console.log(req.url);

///request?a=10&b=200

console.log(req.httpVersion);

//1.1

console.log(req.headers);

// {

// host: '127.0.0.1:3000',

// connection: 'keep-alive',

// 'sec-ch-ua': '"Chromium";v="124", "Microsoft Edge";v="124", "Not-A.Brand";v="99"',

// 'sec-ch-ua-mobile': '?0',

// 'sec-ch-ua-platform': '"Windows"',

// 'upgrade-insecure-requests': '1',

// 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0',

// accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',

// 'sec-fetch-site': 'none',

// 'sec-fetch-mode': 'navigate',

// 'sec-fetch-user': '?1',

// 'sec-fetch-dest': 'document',

// 'accept-encoding': 'gzip, deflate, br, zstd',

// 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6'

// }

//2. express 獨(dú)有的獲取報(bào)文的方式

//獲取查詢字符串

console.log(req.path);

// /request

console.log(req.query); // 『相對(duì)重要』

// { a: '10', b: '200' }

// 獲取指定的請(qǐng)求頭

console.log(req.get('host'));

// /127.0.0.1:3000

res.send('請(qǐng)求報(bào)文的獲取');

});

//啟動(dòng)服務(wù)

app.listen(3000, () => {

console.log('啟動(dòng)成功....')

})

(3)、獲取路由參數(shù)

路由參數(shù)指的是

URL

路徑中的參數(shù)(數(shù)據(jù))

app.get('/:id.html', (req, res) => {

res.send('商品詳情, 商品 id 為' + req.params.id);

});

3、express 響應(yīng)設(shè)置

//獲取請(qǐng)求的路由規(guī)則

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

//1. express 中設(shè)置響應(yīng)的方式兼容 HTTP 模塊的方式

res.statusCode = 404;

res.statusMessage = 'xxx';

res.setHeader('abc','xyz');

res.write('響應(yīng)體');

res.end('xxx');

//2. express 的響應(yīng)方法

res.status(500); //設(shè)置響應(yīng)狀態(tài)碼

res.set('xxx','yyy');//設(shè)置響應(yīng)頭

res.send('中文響應(yīng)不亂碼');//設(shè)置響應(yīng)體

//連貫操作

res.status(404).set('xxx','yyy').send('你好朋友')

//3. 其他響應(yīng)

res.redirect('http://atguigu.com')//重定向

res.download('./package.json');//下載響應(yīng)

res.json();//響應(yīng) JSON

res.sendFile(__dirname + '/home.html') //響應(yīng)文件內(nèi)容

});

4、express 中間件

(1)、全局中間件

聲明中間件函數(shù)

let recordMiddleware = function(request,response,next){

//實(shí)現(xiàn)功能代碼

//.....

//執(zhí)行next函數(shù)(當(dāng)如果希望執(zhí)行完中間件函數(shù)之后,仍然繼續(xù)執(zhí)行路由中的回調(diào)函數(shù),必須調(diào)用next)

next();

}

使用

app.use(recordMiddleware);

express

允許使用

app.use()

定義多個(gè)全局中間件

app.use(function (request, response, next) {

console.log('定義第一個(gè)中間件');

next();

})

app.use(function (request, response, next) {

console.log('定義第二個(gè)中間件');

next();

})

(2)、路由中間件

app.get('/路徑',`中間件函數(shù)`,(request,response)=>{

});

app.get('/路徑',`中間件函數(shù)1`,`中間件函數(shù)2`,(request,response)=>{

});

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

//引入express框架

const express = require('express');

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

const app = express();

//靜態(tài)資源中間件的設(shè)置,將當(dāng)前文件夾下的public目錄作為網(wǎng)站的根目錄

app.use(express.static(__dirname + '/public')); //當(dāng)然這個(gè)目錄中都是一些靜態(tài)資源

//如果訪問(wèn)的內(nèi)容經(jīng)常變化,還是需要設(shè)置路由

//但是,在這里有一個(gè)問(wèn)題,如果public目錄下有index.html文件,單獨(dú)也有index.html的路由,

//則誰(shuí)書寫在前,優(yōu)先執(zhí)行誰(shuí)

app.get('/index.html',(request,response)=>{

respsonse.send('首頁(yè)');

});

//監(jiān)聽端口

app.listen(3000,()=>{

console.log('3000 端口啟動(dòng)....');

});

(4)、獲取請(qǐng)求體數(shù)據(jù) body-parser

express

可以使用

body

-

parser

包處理請(qǐng)求體

第一步:安裝

npm i body-parser

第二步:導(dǎo)入

body-parser

const bodyParser = require('body-parser');

第三步:獲取中間件函數(shù)

//處理 querystring 格式的請(qǐng)求體

let urlParser = bodyParser.urlencoded({extended:false}));

//處理 JSON 格式的請(qǐng)求體

let jsonParser = bodyParser.json();

第四步:設(shè)置路由中間件,然后使用

request.body

來(lái)獲取請(qǐng)求體數(shù)據(jù)

app.post('/login', urlParser, (request,response)=>{

//獲取請(qǐng)求體數(shù)據(jù)

//console.log(request.body);

//{ username: 'admin', userpass: '123456' }

//用戶名

console.log(request.body.username);

//密碼

console.log(request.body.userpass);

response.send('獲取請(qǐng)求體數(shù)據(jù)');

});

5、防盜鏈

6、路由模塊化

創(chuàng)建獨(dú)立的

JS

文件(

homeRouter.js

//1. 導(dǎo)入 express

const express = require('express');

//2. 創(chuàng)建路由器對(duì)象

const router = express.Router();

//3. 在 router 對(duì)象身上添加路由

router.get('/', (req, res) => {

res.send('首頁(yè)');

})

router.get('/cart', (req, res) => {

res.send('購(gòu)物車');

});

//4. 暴露

module.exports = router;

主文件

const express = require('express');

const app = express();

//5.引入子路由文件

const homeRouter = require('./routes/homeRouter');

//6.設(shè)置和使用中間件

app.use(homeRouter);

app.listen(3000,()=>{

console.log('3000 端口啟動(dòng)....');

})

7、模板引擎(ejs)

現(xiàn)在前后端分離所以較少使用

(1)、快速上手

npm i ejs

?常用語(yǔ)法

<% code %>

//1.引入ejs

const ejs = require('ejs');

//2.定義數(shù)據(jù)

let person = ['張三','李四','王二麻子'];

//3.ejs解析模板返回結(jié)構(gòu)

//<%= %> 是ejs解析內(nèi)容的標(biāo)記,作用是輸出當(dāng)前表達(dá)式的執(zhí)行結(jié)構(gòu)

let html = ejs.render(‘<%= person.join(",") %>’, {person:person});

//4.輸出結(jié)果

console.log(html);

(2)、列表渲染

let xiyou

?

=

[

'孫悟空

'

,

'唐僧

'

,

'豬八戒

'

];

(3)、條件渲染

(4)、在express中使用ejs

(5)、express-generator

搭建一個(gè)框架

方式一安裝

npx express-generator

方式二安裝

npm install-g express-generator

?

使用

express -e 項(xiàng)目名稱

//安裝依賴

npm i

//運(yùn)行

npm start

8、文件上傳

(1)、前端上傳

(2)、出路文件上傳請(qǐng)求

npm i formidable

//處理文件上傳

router.post('/portrait', (req, res) => {

//創(chuàng)建 form 對(duì)象

const form = formidable({

multiples: true ,

//設(shè)置上傳文件的保存目錄

uploadDir: __dirname + '/../public/images',

//保持文件后綴

keepExtensions: true

});

//解析請(qǐng)求報(bào)文

form.parse(req, (err, fields, files) => {

if (err) {

next(err);

return;

}

// console.log(fields);// text radio checkbox select

// console.log(files); // file

//服務(wù)器保存該圖片的訪問(wèn) URL

// /images/8ad3d5e36012212ba7642c000.jpg

let url = '/images/' + files.portrait.newFilename;// 將來(lái)將此數(shù)據(jù)保存在數(shù)據(jù)庫(kù)中

res.send(url);

});

});

九、express中的會(huì)話控制

1、cookie

const express =require('express');

//1. 安裝 cookie-parser npm i cookie-parser

//2. 引入 cookieParser 包

const cookieParser = require('cookie-parser');

const app = express();

//3. 設(shè)置 cookieParser 中間件

app.use(cookieParser());

//4-1 設(shè)置 cookie

app.get('/set-cookie', (request, response) => {

// 不帶時(shí)效性 瀏覽器刪除就關(guān)閉

response.cookie('username','wangwu');

// 帶時(shí)效性

response.cookie('email','23123456@qq.com', {maxAge: 5*60*1000 });

//響應(yīng)

response.send('Cookie的設(shè)置');

});

//4-2 讀取 cookie

app.get('/get-cookie', (request, response) => {

//讀取 cookie

console.log(request.cookies);

//響應(yīng)體

response.send('Cookie的讀取');

});

//4-3 刪除cookie

app.get('/delete-cookie', (request, response) => {

//刪除

response.clearCookie('username');

//響應(yīng)

response.send('cookie 的清除');

});

//4. 啟動(dòng)服務(wù)

app.listen(3000, () => {

console.log('服務(wù)已經(jīng)啟動(dòng)....');

});

獲取cookie

npm i cookie-parser

?

?

2、session

const express = require('express');

//1. 安裝包 npm i express-session connect-mongo

//2. 引入 express-session connect-mongo

const session = require("express-session");

const MongoStore = require('connect-mongo');

const app = express();

//3. 設(shè)置 session 的中間件

app.use(session({

name: 'sid', //設(shè)置cookie的name,默認(rèn)值是:connect.sid

secret: 'atguigu', //參與加密的字符串(又稱簽名)

saveUninitialized: false, //是否為每次請(qǐng)求都設(shè)置一個(gè)cookie用來(lái)存儲(chǔ)session的id

resave: true, //是否在每次請(qǐng)求時(shí)重新保存session

store: MongoStore.create({

mongoUrl: 'mongodb://127.0.0.1:27017/project' //數(shù)據(jù)庫(kù)的連接配置

}),

cookie: {

httpOnly: true, // 開啟后前端無(wú)法通過(guò) JS 操作

maxAge: 1000 * 300 // 這一條 是控制 sessionID 的過(guò)期時(shí)間的?。?!

},

}))

//創(chuàng)建 session

app.get('/login', (req, res) => {

//設(shè)置session

req.session.username = 'zhangsan';

req.session.email = 'zhangsan@qq.com'

res.send('登錄成功');

})

//獲取 session

app.get('/home', (req, res) => {

console.log('session的信息');

console.log(req.session.username);

if (req.session.username) {

res.send(`你好 ${req.session.username}`);

}else{

res.send('登錄 注冊(cè)');

}

})

//銷毀 session

app.get('/logout', (req, res) => {

//銷毀session

// res.send('設(shè)置session');

req.session.destroy(() => {

res.send('成功退出');

});

});

app.listen(3000, () => {

console.log('服務(wù)已經(jīng)啟動(dòng), 端口 ' + 3000 + ' 監(jiān)聽中...');

});

3、session 和 cookie 的區(qū)別 ?

4、token(JWT)

npm i jsonwebtoken

//導(dǎo)入 jsonwebtokan

const jwt = require('jsonwebtoken');

//創(chuàng)建 token

// jwt.sign(數(shù)據(jù), 加密字符串, 配置對(duì)象)

let token = jwt.sign({

username: 'zhangsan'

}, 'atguigu', {

expiresIn: 60 //單位是 秒

})

//解析 token

jwt.verify(token, 'atguigu', (err, data) => {

if(err){

console.log('校驗(yàn)失敗~~');

return

}

console.log(data);

})

十、本地域名

編輯文件

C:\Windows\System32\drivers\etc\hosts

例如

127.0.0.1 www.baidu.com

如果修改失敗,

可以修改該文件的權(quán)限

柚子快報(bào)激活碼778899分享:node.js

http://yzkb.51969.com/

相關(guān)文章

評(píng)論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19076233.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問(wèn)

文章目錄