目錄
言歸正傳,Express出手
Router的介紹& 使用
中間件
異常處理
實戰中的ORM模型建立
首頁 web前端 js教程 詳解nodejs中的express

詳解nodejs中的express

Mar 11, 2021 am 10:09 AM
express nodejs

這篇文章要跟大家介紹一下node中的express。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

詳解nodejs中的express

相關推薦:《nodejs 教學

在此之前,先說一個很有用的-nodemon ——> ; 自動編譯

npm install nodemon -D
登入後複製

完成後將設定檔json中"script"選項中的「start」欄位修改如下:

"start":"nodemon js路径+名",
//增加一行
"start:node":"node js路径+名",
...
登入後複製

但是現在我們發現一個問題:無論什麼檔案做什麼樣的改動,都會重新啟動node。

我們乾脆指定:監視js檔案:

新nodemon.json

{
	"watch":["./src/**/*.js"]
}
登入後複製

(src是與json平階的(js所在的)目錄名)

經此之後,伺服器就能自動的npm start了。

言歸正傳,Express出手

我們對express的第一認知:node中的一種web框架。

如下:用express搭建一個web應用

npm install express -S       # "-S":在生产环境中搭载
npm install nodemon -D
登入後複製

在src目錄(自建資料夾)下設app.js:

const express=require('express');
//一个express实例
const app=express();
//app.use((req,res)=>{
//	res.json({
//	name:"张上"
//	})
//})
app.get('/name',(req,res)=>{
	let {age}=req.params;
	res.send('tom');
});
app.post('/name',(req,res)=>{
	res.send('tom post');
});

app.listen(8081,()=>{
	console.log('启动成功');
});
登入後複製

看到程式碼第3行,有沒有想到http?
const server=http.createServer((req,res)=>{...});
這裡的server和上面的app是一樣的。但兩個req不一樣,因為app的req是經過express封裝過的,它的功能更豐富!

在package.json(產生的設定檔)中修改:

// "script"选项下第一个——"start"值中加一个“nodemon”字样:
"start":"nodemon ./src/app.js",
...
登入後複製

那如上程式碼怎麼傳參?

// get方式传参
app.get('/name/:age',(req,res)=>{
	let {age}=req.params;
	res.json({
		name:'tom',
		age
	})
})
登入後複製

Router的介紹& 使用

web服務如何處理一個請求
url --> 網路--> dns解析--> 目標伺服器

  • 如何回應這個請求— 路由! (規則)

  • 如何區分- 請求方法(get/post)、uri(路徑)

const express=require('express');
const app=express();
//1.请求方法判断 ——测试工具:postman
app.get('/demo',(req,res)=>{
	res.json({
		message:'hello get mxc'
	})
});
app.post('/demo',(req,res)=>{
	res.json({
		message:'hello post mxc'
	})
});

//2.通过URI ——postman上测试:http://127.0.0.1:8081/user/byname?name=mxc
//或:http://127.0.0.1:8081/user/byid?id=123
app.get('/user/byname',(req,res)=>{
	let {name}=req.query;
	res.json({
		name
	})
});
app.get('/user/byid',(req,res)=>{
	let {id}=req.query;
	res.json({
		id
	})
});

app.listen(8081,()=>{
	console.log('server已启动');
});
登入後複製

路由API

定義一個api,需要滿足客戶端無論以什麼請求方式,都可以得到回應

app.all('/demo',(req,res)=>{
	res.json({
		message:'demo',
		method:req.method
	})
});
登入後複製

無論客戶端使用任何URI,我們的服務都可以回應(日誌)

app.all('*',(req,res)=>{
	res.json({
		message:'demo',
		method:req.method,
		uri:req.path
	})
});
登入後複製

app.use --> 中間件

app.use('/demo',(req,res)=>{
	res.json({
		message:'from use demo',
		method:req.method
	})
});

app.use((req,res)=>{
	res.json({
		message:'demo',
		method:req.method,
		uri:req.path
	})
});
登入後複製

如何做路由的分割? —— express.Router

在member.router.js檔案中:

const express=require('express');
const router=express.Router();
//router.[method]//(get/post)
//router.all
//router.use
router.get('/list',(req,res)=>{
	res.json({
		list:[
			id:001,
			name:'mxc'
		]
	})
});
module.exports=router;
登入後複製

在app.js中「 註冊路由 」:

const memberRouter=require('./member.router.js');app.use(memberRouter);
登入後複製

現在我們再寫一個skuRouter的路由,它的URI中也有「/list」。
註冊完以後。我們發現找不到了(印不出來),那怎麼辦?

其實,路由use裡面我們可以加一個“前綴”——也就是“根”,加以區分:

const memberRouter=require('./member.router.js');
app.use(memberRouter);
登入後複製

中間件

express中間件

使用:

  • app層級使用(註冊時,一定是在最頂級/端)

  • router層級

  • 異常處理

#(普通)中間件

我們應該先考慮一個問題:為什麼需要「中間件」:程式不能一步「走完」。

你比如說下面這個demo:取得input內容:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form action="http://localhost:8081" method="post">
用户:<input type="text" name="user" /><br />
密码:<input type="password" name="pass" /><br />
<input type="submit" value="提交">
</form>
</body>
</html>
登入後複製
npm install body-parser
登入後複製
const express=require('express');
const bodyParser=require('body-parser');
var server=express();
server.listen(8081);
server.use(bodyParser,urlencoded({}));
// 上面一行有时也写为:server.use(bodyParser,urlencoded({extended:true}));
server.use('/',function(req,res){
	console.log(req.body);
});
登入後複製

#毫無疑問,這比平常「多出來的」一行:server.use(bodyParser,urlencoded({ })); 是所謂的「中間件的使用」。

現在該思考另一個問題了:為什麼程式「一步走不完」?
如上述程式碼, POST的req中應該有「 body 」嗎?
很顯然不應該。 body本來就不存在啊! (不然ajax還去用data?)

但我們現在確實需要。所以第2行const bodyParser=require('body-parser'); 申請了“中間件模組”,在第5行為整個“鍊式操作”(兩個use連著)給“裝上”了一個body。

通常來說,在實戰中中間件我們會寫3個,構成一條「完整的」參數解析大法:
app.use(express.json()) ;
app.use(express.urlencoded());
app.use(bodyParser,urlencoded({extended:true}));
//然後再get/post操作

當然,如果前面是GET方式提交,node中直接用req.query即可,也就不需要中間件了。

那既然中間件這麼“有用”,不如自己封裝一個?
mxc-body-parser.js檔案

// 仿body-parser中间件
const querystring=require('querystring');
module.exports=function(req,res,next){
	var str='';
	req.on('data',function(data){
		str+=data;
	});
	req.on('end',function(){
		req.body=querystring.parser(str);
		next();
	});
}
登入後複製

然後在其他檔案裡引用:

const express=require('express');
const mxcParser=require('./lib/mxc-body-parser');
var server=express();
server.listen(8081);
server.use(mxcParser);
server.use('/',function(req,res){
	console.log(req.body);
});
登入後複製

異常處理

#——視覺化
通常,異常處理都是全域進行的。

一般做法:throw new Error('測試功能異常');
node-express內建例外處理:

function error_handler_middleware(err,req,res,next){
	if(err){
		let {message}=err;
		res.status(500).json({
			message:`${message || '服务器异常'}`
		})
	}else{
		//其余操作
	}
}
...
app.use(error_handler_middleware);   //放在所有Router最后,做中间件用
登入後複製

實戰中的ORM模型建立

先說說資料庫初始化

建立完mysql,我們要將node和mysql連接,用到的工具:

npm install express mysql2 sequelize nodemon sequelize-cli -S
登入後複製

连接成功后会生成config.json配置文件,我们在development选项中修改和添加:

"database":"数据库表名",
"timezone":"+08:00"
登入後複製

持久化模型对应的数据库表:

npx sequelize db:migrate
登入後複製

前端数据如何往mysql中写?

调用todo.js模块:

use strict' ;
module. exports = (sequelize, DataTypes) => {
	const Todo = sequelize.define( 'Todo', {
		name: DataTypes. STRING,
		deadLine: DataTypes .DATE,
		content: DataTypes. STRING
	},{
		timestamps:false
	}) ;
	Todo. associate = function(models) {
		// associations can be def ined here
	};	
	return Todo;
};
登入後複製

使用:创建第一个todo:(初始时)

app.post('/create',async (req,res,next)=>{
	try{
		let {name,deadline,content}=req.body;
		//持久化到数据库
		let todo=await models.Todo.create({
			name,
			deadline,
			content
		})
		res.json({
			todo,
			message:'任务创建成功'
		})
	}catch(err){
		next(error)
	}
})
登入後複製

最后的next传给谁?

我们之前说,在全局最后创建一个use,用于错误处理:

app.use((err,req,res,next)=>{
	if(err){
		res.status(500).json({
			message:err.message
		})
	}
})
登入後複製

更多编程相关知识,请访问:编程入门!!

以上是詳解nodejs中的express的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

nodejs是後端框架嗎 nodejs是後端框架嗎 Apr 21, 2024 am 05:09 AM

Node.js 可作為後端框架使用,因為它提供高效能、可擴展性、跨平台支援、豐富的生態系統和易於開發等功能。

nodejs怎麼連接mysql資料庫 nodejs怎麼連接mysql資料庫 Apr 21, 2024 am 06:13 AM

要連接 MySQL 資料庫,需要遵循以下步驟:安裝 mysql2 驅動程式。使用 mysql2.createConnection() 建立連接對象,其中包含主機位址、連接埠、使用者名稱、密碼和資料庫名稱。使用 connection.query() 執行查詢。最後使用 connection.end() 結束連線。

nodejs中的全域變數有哪些 nodejs中的全域變數有哪些 Apr 21, 2024 am 04:54 AM

Node.js 中存在以下全域變數:全域物件:global核心模組:process、console、require執行階段環境變數:__dirname、__filename、__line、__column常數:undefined、null、NaN、Infinity、-Infinity

nodejs和java的差別大嗎 nodejs和java的差別大嗎 Apr 21, 2024 am 06:12 AM

Node.js 和 Java 的主要差異在於設計和特性:事件驅動與執行緒驅動:Node.js 基於事件驅動,Java 基於執行緒驅動。單執行緒與多執行緒:Node.js 使用單執行緒事件循環,Java 使用多執行緒架構。執行時間環境:Node.js 在 V8 JavaScript 引擎上運行,而 Java 在 JVM 上運行。語法:Node.js 使用 JavaScript 語法,而 Java 使用 Java 語法。用途:Node.js 適用於 I/O 密集型任務,而 Java 適用於大型企業應用程式。

nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 Apr 21, 2024 am 05:18 AM

Node.js 安裝目錄中有兩個與 npm 相關的文件:npm 和 npm.cmd,區別如下:擴展名不同:npm 是可執行文件,npm.cmd 是命令視窗快捷方式。 Windows 使用者:npm.cmd 可以在命令提示字元中使用,npm 只能從命令列執行。相容性:npm.cmd 特定於 Windows 系統,npm 跨平台可用。使用建議:Windows 使用者使用 npm.cmd,其他作業系統使用 npm。

nodejs是後端開發語言嗎 nodejs是後端開發語言嗎 Apr 21, 2024 am 05:09 AM

是的,Node.js 是一種後端開發語言。它用於後端開發,包括處理伺服器端業務邏輯、管理資料庫連接和提供 API。

nodejs專案怎麼部署到伺服器 nodejs專案怎麼部署到伺服器 Apr 21, 2024 am 04:40 AM

Node.js 專案的伺服器部署步驟:準備部署環境:取得伺服器存取權限、安裝 Node.js、設定 Git 儲存庫。建置應用程式:使用 npm run build 產生可部署程式碼和相依性。上傳程式碼到伺服器:透過 Git 或檔案傳輸協定。安裝依賴項:SSH 登入伺服器並使用 npm install 安裝應用程式相依性。啟動應用程式:使用 node index.js 等命令啟動應用程序,或使用 pm2 等進程管理器。設定反向代理(可選):使用 Nginx 或 Apache 等反向代理路由流量到應用程式

nodejs和java選哪個 nodejs和java選哪個 Apr 21, 2024 am 04:40 AM

Node.js 和 Java 在 Web 開發中各有優劣,因此選擇取決於專案需求。 Node.js 擅長即時應用程式、快速開發和微服務架構,而 Java 則在企業級支援、效能和安全性方面佔優。

See all articles