国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

node中間件-express框架

這篇具有很好參考價(jià)值的文章主要介紹了node中間件-express框架。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前置 Express安裝

  • 方式一 : express提供的腳手架,直接創(chuàng)建一個(gè)應(yīng)用的骨架
  1. 安裝腳手架npm install -g express-generator
  2. 創(chuàng)建項(xiàng)目 express express-demo
  3. 安裝依賴npm install
  4. 啟動(dòng)項(xiàng)目 node bin/www
  • 方式二 : 從零搭建自己的express應(yīng)用結(jié)構(gòu);
  1. 初始化項(xiàng)目 npm init
  2. 安裝express npm i express

1. 基本使用

  1. 導(dǎo)入–>創(chuàng)建–>監(jiān)聽
  2. 使用參考文檔

const express = require('express');
//  * 創(chuàng)建express服務(wù)器
const app=express()
//  * 啟動(dòng)服務(wù)器 ,監(jiān)聽端口

app.listen(8000,()=>{
	console.log('啟動(dòng)express 服務(wù)器')
})

// 請(qǐng)求
app.post('/login',(req,res)=>{
     res.end('登錄成功')
})

app.get('/home',(req,res)=>{
    res.end('home 列表模塊')
})

2. 中間件

  • 中間件的本質(zhì)是傳遞給express的一個(gè)回調(diào)函數(shù);
  • 這個(gè)回調(diào)函數(shù)接受三個(gè)參數(shù):
    • 請(qǐng)求對(duì)象(request對(duì)象);
    • 響應(yīng)對(duì)象(response對(duì)象);
    • next函數(shù)(在express中定義的用于執(zhí)行下一個(gè)中間件的函數(shù));
      重要 :中間件的執(zhí)行過程,只會(huì)執(zhí)行第一次匹配的中間件,關(guān)于后面是否執(zhí)行看next
app.post('/login', (req, res, next) => {
    // 中間件中的req與res可以進(jìn)行修改
    res.aaa = '添加aaa并修改res'
    // 2. JSON結(jié)束
    // res.json({message:'登錄成功',code:200})
    // res.end('登錄成功')
    // 3. next 匹配執(zhí)行下一個(gè)中間件
    next()
})
  • 注意點(diǎn)如果當(dāng)前中間件功能沒有結(jié)束請(qǐng)求-響應(yīng)周期,則必須調(diào)用next()這將控制權(quán)傳遞給下一個(gè)中間件功能,否則,請(qǐng)求將被掛起
    node中間件-express框架,node,中間件,express,arcgis

const express = require('express');
//  * 創(chuàng)建express服務(wù)器
const app = express()
//  * 啟動(dòng)服務(wù)器 ,監(jiān)聽端口

app.listen(8000, () => {
    console.log('啟動(dòng)express 服務(wù)器')
})

// 請(qǐng)求
app.post('/login', (req, res, next) => {
    // 中間件中的req與res可以進(jìn)行修改
    res.aaa = '添加aaa并修改res'
    // 2. JSON結(jié)束
    // res.json({message:'登錄成功',code:200})
    // res.end('登錄成功')
    // 3. next 匹配執(zhí)行下一個(gè)中間件
    next()
})

app.use((req,res,next)=>{
    console.log('執(zhí)行下一個(gè)中間件next');
})

app.get('/home', (req, res) => {
    res.end('home 列表模塊')
})

2.1 中間件應(yīng)用

  • express主要提供了兩種方式:
    • app/router.use;
    • app/router.methods;

app.use

app.use((req,res,next)=>{
    console.log('執(zhí)行下一個(gè)中間件next');
})

app.methods


app.get('/home', (req, res) => {
    res.end('home 列表模塊')
})

3. 中間件的注冊(cè)方式

3.1 普通中間件的注冊(cè)

  • use注冊(cè)的中間件不管什么路徑或者請(qǐng)求都可以匹配的上
  • 同時(shí)在匹配的過程中如何不 next(), 只會(huì)執(zhí)行第一個(gè)中間件
// 1. use注冊(cè)的中間件不管什么路徑或者請(qǐng)求都可以匹配的上
// 2. 同時(shí)在匹配的過程中如何不 next(), 只會(huì)執(zhí)行第一個(gè)中間件
app.use((req,res,next)=>{
    console.log('執(zhí)行下一個(gè)中間件next');
    next()
})

app.use(()=>{
    console.log('執(zhí)行第二個(gè)中間件')
})

3.2 path匹配中間件

-路徑匹配中間件只是對(duì)路徑做限制并沒有對(duì)請(qǐng)求方式做顯示

// 這里的路徑匹配中間件只是對(duì)路徑做限制并沒有請(qǐng)求方式做顯示
// 不管method如何都可以匹配 
app.use('/home',(req,res,next)=>{
	console.log('路徑匹配中間件')
})

3.3 method與路徑匹配

  • 語法: app.method(path,middleware)
  • 匹配中間件只會(huì)匹配第一個(gè)符合要求的中間件 , 關(guān)于下一個(gè)中間件是否執(zhí)行看有沒有調(diào)用next
// app.method(path,middleware)
app.get('/home',(req,res,next)=>{
	console.log('路徑以及方法匹配');
	res.end('匹配成功')
})

// 注冊(cè)多個(gè)中間件
app.get('/home', (req, res, next) => {
	console.log('路徑以及方法匹配');
	res.end('匹配成功')
	// 中間的匹配只會(huì)匹配第一個(gè)符合要求的中間件 , 關(guān)于下一個(gè)中間件是否執(zhí)行看有沒有調(diào)用next
}, (req, res, next)=>{
   console.log('關(guān)于這個(gè)中間件的執(zhí)行需要看上一個(gè)中間件是否有next');
})

3.4 案列中間件匹配與執(zhí)行方法

  • 普通直接寫法
app.post('/login', (req, res, next) => {
	req.on('data', data => {
		let userInfo = data.toString()
		const user = JSON.parse(userInfo)
		if (user.username === 'admin' && user.password===123456) {
			res.end('登錄成功')
		}else{
			res.end('賬號(hào)或者密碼錯(cuò)誤')
		}
	})

})

//  注冊(cè)信息
app.post('/register', (req, res, next) => {
	// res.end('注冊(cè)成功')
	// 注冊(cè)要查詢數(shù)據(jù)庫,看是否存在用戶名
   if (true) {
		 req.on('data', data => {
			 let userInfo = data.toString()
			 const user = JSON.parse(userInfo)
			 if (user.username === 'admin' && user.password === 123456) {
				 res.end('注冊(cè)成功')
			 } else {
				 res.end('賬號(hào)或者密碼錯(cuò)誤')
			 }
		 })
	 }

})
  • ** 優(yōu)化 JSON解析,放到body后next()**
// 1. JSON解析,放到body
app.use((req, res, next) => {
	if (req.headers['content-type'] === 'application/json') {
		req.on('data', data => {
			const jsonInfo = JSON.parse(data.toString())
			req.body = jsonInfo
		})
		req.on('end', () => {
			next()
		})
	}
})

// 賬號(hào)密碼
app.post('/login', (req, res, next) => {
  console.log(req.body);
	res.end('登錄成功')
})
//  注冊(cè)信息
app.post('/register', (req, res, next) => {
	console.log(req.body);
})

4. 中間件request數(shù)據(jù)解析

  • express有內(nèi)置一些幫助我們完成對(duì)request解析的中間件;

4.1 解析request body中間件

app.use((req, res, next) => {
	if (req.headers['content-type'] === 'application/json') {
		req.on('data', data => {
			const jsonInfo = JSON.parse(data.toString())
			req.body = jsonInfo
		})
		req.on('end', () => {
			next()
		})
	}
	next()
})
// 賬號(hào)密碼
app.post('/login', (req, res, next) => {
  console.log(req.body);
	res.end('登錄成功')
})
  • 上面代碼中利用JSON.parse對(duì)data數(shù)據(jù)進(jìn)行解析 ,但是 express中提供了 json可以直接進(jìn)行解析
app.use(express.json())
// 賬號(hào)密碼
app.post('/login', (req, res, next) => {
  console.log(req.body);
	res.end('登錄成功')
})

4.2 urlencoded解析

  • 解析客戶端利用urlencoded傳參 , 這時(shí)就需要用 express.urlencoded()
    node中間件-express框架,node,中間件,express,arcgis
app.use(express.urlencoded())  // 解析客戶端利用urlencoded傳參
// 解決 body - parser deprecated undefined extended: provide extended option 05urlencoded警告
app.use(express.urlencoded({ extended: true }))
app.post('/login', (req, res, next) => {
	console.log(req.body);
	res.end('登錄成功')
})

5. 第三方中間件

5.1 morgan 日志記錄

const express = require('express');
const morgan = require('morgan');
const fs = require('fs');
const app = express()
// cnpm i morgan  安裝
// 第三方中間件 合并日志
const writerLog=fs.createWriteStream('./log.txt')
// 日志寫入
app.use(morgan('combined', { stream: writerLog }))
app.post('/login', (req, res, next) => {
	console.log(req.body);
	res.end('登錄成功')
})

5.2 multer 文件上傳

  1. 安裝 npm i multer --save
  2. Multer 只處理任何 multipart/form-data 類型的表單數(shù)據(jù)。
  3. Multer 會(huì)在express 的 request 對(duì)象里添加一個(gè) body 對(duì)象 (包含表單的文本域信息)以及 filefiles 對(duì)象 (單文件通過req.file獲取,多文件通過req.files獲取,file 或 files 對(duì)象包含對(duì)象表單上傳的文件信息)。
  4. 注意點(diǎn) upload.single的值,對(duì)應(yīng)前端name中的值,同時(shí)也要保住 form-data 中key的值相同。
const multer = require('multer');
// 對(duì)上傳的文件名字重起
const upload = multer({
	storage: multer.diskStorage({
		//  文件名稱, 
		// destination 是用來確定上傳的文件應(yīng)該存儲(chǔ)在哪個(gè)文件夾中
		// destination 是一個(gè)函數(shù),必須創(chuàng)建這個(gè)文件夾
		destination(require, file, callback) {
			callback(null, 'uploads/')
		},
		filename(require, file, callback) {
			// originalname是文件上傳時(shí)的名字,可以根據(jù)它獲取后綴
			callback(null, Date.now() + '_' + file.originalname)
		}
	})
})
app.post('/upload', upload.single("file"), (req, res, next) => {
	console.log(req.file);  // 文件信息
	res.end('文件上傳成功')
})

  • 多文件上傳 ,接受的是一個(gè)數(shù)組
  • 同時(shí)在 multer實(shí)例.array(fielname[,maxCount])——接收一個(gè)以fielname命名的文件數(shù)組;maxCount——限制上傳的最大數(shù)量,這些文件的信息保存在req.files里面
app.post('/upload', upload.array("file"), (req, res, next) => {
	console.log(req.files);  // 文件信息
	res.end('文件上傳成功')
})

參考解析

  • storage存儲(chǔ)引擎以及錯(cuò)誤處理
  • 前后端上傳案例

解析form-data中的普通數(shù)據(jù)

const formData=  multer()
app.post('/login',formData.any(), (req, res, next) => {
	console.log(req.body);  
	res.end('登錄成功')
})

6. 參數(shù)解析 params和query

  • query 主要用于分頁
app.post('/list', (req, res, next) => {
	// http://localhost:8000/list?offset=10&page=20解析
	console.log(req.query);   // { offset: '10', page: '20' }
	res.end('登錄成功')
})
  • params 主要用于id的傳遞
app.post('/user/:id', (req, res, next) => {
	// http://localhost:8000/user/1100
	
	const id = req.params.id
	res.end(`獲取用戶${id}`)
})

7. 響應(yīng)數(shù)據(jù)

  • end方式 : 類似于http中的response.end方法,用法是一致的
  • json方法 : json方法中可以傳入很多的類型:object、array、string、boolean、number、null等,它們會(huì)被轉(zhuǎn)換成json格式返回
  • status方法 : 用于設(shè)置狀態(tài)碼;注意 是函數(shù)
  • 其他響應(yīng)內(nèi)容參考

app.get('/login', (req, res, next) => {
	// 1. 方法一 end
	// res.end(`響應(yīng)數(shù)據(jù)---登錄成功`)
	//  2. JSON數(shù)據(jù)響應(yīng)
	// res.json({
	// 	code: 0, message: '歡迎回來', data: [{
	// 		name: "admin",
	// 		avator:'www.http.ccc.jpg'
	// 	}]
	// })

	//  3. status 方法,設(shè)置http狀態(tài)碼
	res.status(201)
	res.json(
		{
			code: 0, message: '歡迎回來', data: [{
				name: "admin",
				avator: 'www.http.ccc.jpg'
			}]
		}
	)
})

8. 路由

  • express.Router來創(chuàng)建一個(gè)路由處理程序

useRouter.js

const express = require('express');
const userRouter = express.Router()
userRouter.get('/', (req, res, next) => {
	res.json(
		{
			code: 0, message: 'success', data: [{
				name: "admin",
				password:'123456'
			}, {
					name: "admin",
					password: '123456'
				}]
		}
	)
})
userRouter.get('/:id',(req, res, next) => {
	const id=req.params.id
	res.end(id)
})
userRouter.post('/', (req, res, next) => {
})
userRouter.delete('/:id', (req, res, next) => {
})
userRouter.patch('/:id', (req, res, next) => {

})

module.exports=userRouter

index.js

const userRouter = require('./router/userRouters.js');
app.use('/users', userRouter)

參考文章 :路由在項(xiàng)目中的具體使用文章來源地址http://www.zghlxwxcb.cn/news/detail-603502.html

9. 靜態(tài)資源

  1. express 內(nèi)置static() 靜態(tài)資源,直接將文件夾做一個(gè)靜態(tài)資源
app.use(express.static('./uploads')) 

10 錯(cuò)誤處理

  • 普通的錯(cuò)誤處理,需要利用前端的數(shù)據(jù)進(jìn)行if判斷處理
  • 但是每一個(gè)接口寫一個(gè)判斷或者返回的錯(cuò)誤信息以及狀態(tài)碼相同,這就會(huì)造成代碼的甬余
app.post('/login', (req, res, next) => {
	const { username, password } = req.body
	if (username !== 'admin' || password !== 123456) {

		res.json({
			code: 1002,
			message: '賬號(hào)密碼錯(cuò)誤'
		})
	} else {
		console.log('xx')
		res.json({
			code: 200,
			message: '登錄成功'
		})
	}
})
  • 簡單封裝統(tǒng)一處理
// 中間件處理錯(cuò)誤信息
app.post('/login', (req, res, next) => {
	if (username !== 'admin' || password !== 123456) {
		next(1002)
	}
	else {
		next()
	}
})
app.use((errCode, req, res, next) => {
	const code = errCode
	let message = ''
	switch (code) {
		case 1001:
			message = '未知的錯(cuò)誤'
			break
		case 1002:
			message = '賬號(hào)或密碼錯(cuò)誤'
		default:
			message = '登錄成功'
	}
	res.json({
		code: errCode,
		message,
	})
})

到了這里,關(guān)于node中間件-express框架的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Express中間件

    Express中間件

    客戶端發(fā)起的任何請(qǐng)求,到達(dá)服務(wù)器之后,都會(huì)觸發(fā)的中間件 多個(gè)局部生效的中間件 ? 中間件必須在路由之前注冊(cè) ? 應(yīng)用中間件 路由中間件 錯(cuò)誤級(jí)別中間件 ???????????? 錯(cuò)誤級(jí)別中間件必須在所有路由之后 內(nèi)置中間件 舉例:express.json() 08.中間件-自定義中間件_嗶哩

    2024年02月13日
    瀏覽(17)
  • 初識(shí)express/路由/中間件

    初識(shí)express/路由/中間件

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???????? ? ? ? ?

    2024年02月11日
    瀏覽(44)
  • 93 # 實(shí)現(xiàn) express 錯(cuò)誤處理中間件

    93 # 實(shí)現(xiàn) express 錯(cuò)誤處理中間件

    上一節(jié)實(shí)現(xiàn)了 express 的中間件,這一節(jié)來實(shí)現(xiàn)錯(cuò)誤處理中間件 執(zhí)行某一步出錯(cuò)了,統(tǒng)一規(guī)定調(diào)用 next 傳遞的參數(shù)就是錯(cuò)誤信息 先看 express 實(shí)現(xiàn)的demo 然后去訪問: http://localhost:3000/ 錯(cuò)誤處理中間價(jià),里面必須要有 4 個(gè) 參數(shù)(取函數(shù)的長度),放到棧的最底下 下面實(shí)現(xiàn)處理邏

    2024年02月07日
    瀏覽(28)
  • 【Express】文件上傳管理 multer 中間件

    Multer是Node.js中用于處理文件上傳的中間件。它可以幫助你處理文件上傳的相關(guān)邏輯,如接收和保存上傳的文件、限制文件大小、設(shè)置文件類型限制等。只能用于處理 multipart/form-data 類型的表單數(shù)據(jù),它主要用于上傳文件。 下面是使用Multer中間件的基本步驟: 安裝multer:在命

    2024年02月07日
    瀏覽(23)
  • 編寫中間件以用于 Express 應(yīng)用程序

    編寫中間件以用于 Express 應(yīng)用程序

    中間件 函數(shù)能夠訪問請(qǐng)求對(duì)象?( req )、響應(yīng)對(duì)象?( res ) 以及應(yīng)用程序的請(qǐng)求/響應(yīng)循環(huán)中的下一個(gè)中間件函數(shù)。下一個(gè)中間件函數(shù)通常由名為? next ?的變量來表示。 中間件函數(shù)可以執(zhí)行以下任務(wù): 執(zhí)行任何代碼。 對(duì)請(qǐng)求和響應(yīng)對(duì)象進(jìn)行更改。 結(jié)束請(qǐng)求/響應(yīng)循環(huán)。 調(diào)用堆棧

    2024年02月10日
    瀏覽(20)
  • express學(xué)習(xí)筆記5 - 自定義路由異常處理中間件

    express學(xué)習(xí)筆記5 - 自定義路由異常處理中間件

    修改router/index.js,添加異常處理中間件 完整代碼 創(chuàng)建 utils/constant:(為了方便后期統(tǒng)一維護(hù),單獨(dú)拉出來定義) 然后刷新http://localhost:8000/user ?這就完成了

    2024年02月14日
    瀏覽(30)
  • express中間件當(dāng)做前端服務(wù)器的安全漏洞處理

    使用express當(dāng)做node服務(wù)器時(shí),發(fā)現(xiàn)安全漏洞,記錄處理步驟: PS:以下安全內(nèi)容處理,需要使用到redis進(jìn)行會(huì)話存儲(chǔ)、請(qǐng)求計(jì)數(shù)、請(qǐng)求唯一限制等。為盡量確保開發(fā)環(huán)境與部署環(huán)境一致,請(qǐng)開發(fā)環(huán)境安裝并啟動(dòng)Redis服務(wù)。 ** 此文檔只是說明記錄關(guān)鍵步驟。具體實(shí)現(xiàn)代碼可參照附

    2024年03月27日
    瀏覽(27)
  • 第九篇:node靜態(tài)文件服務(wù)(中間件)

    第九篇:node靜態(tài)文件服務(wù)(中間件)

    ????江城開朗的豌豆 :個(gè)人主頁 ????個(gè)人專欄? :《 VUE 》?《 javaScript 》 ??? ?個(gè)人網(wǎng)站? :《 江城開朗的豌豆?? 》? ???生活的理想,就是為了理想的生活?! 當(dāng)今互聯(lián)網(wǎng)時(shí)代,Node.js 成為了最受歡迎的服務(wù)器端開發(fā)平臺(tái)之一。作為一名小白,學(xué)習(xí) Node.js 可能會(huì)讓你感

    2024年02月20日
    瀏覽(18)
  • cool Node后端 中實(shí)現(xiàn)中間件的書寫

    cool Node后端 中實(shí)現(xiàn)中間件的書寫

    1.需求 在node后端中,想實(shí)現(xiàn)一個(gè)專門鑒權(quán)的文件配置,可以這樣來解釋 就是 有些接口需要token調(diào)用接口,有些接口不需要使用token 調(diào)用? 這期來詳細(xì)說明一下 ? ? ?什么是中間件中間件顧名思義是指在請(qǐng)求和響應(yīng)中間,進(jìn)行請(qǐng)求數(shù)據(jù)的攔截處理,數(shù)據(jù)校驗(yàn),并且進(jìn)行邏輯處理

    2024年02月20日
    瀏覽(25)
  • 中間件框架知識(shí)進(jìn)階

    中間件框架知識(shí)進(jìn)階

    近期從不同渠道了解到了一些中間件相關(guān)的新的知識(shí),記錄一下收獲。涉及到的中間件包括RPC調(diào)用、動(dòng)態(tài)配置中心、MQ、緩存、數(shù)據(jù)庫、限流等,通過對(duì)比加深理解,方便實(shí)際應(yīng)用時(shí)候更明確如何進(jìn)行設(shè)計(jì)和技術(shù)選型。 目前主流的RPC中間件包括Dubbo、HSF、Thrift、GRPC、Spring Cl

    2024年01月16日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包