Inhaltsverzeichnis
言归正传,Express出手
Router的介绍 & 使用
中间件
异常处理
Heim Web-Frontend js-Tutorial Detaillierte Erklärung von Express in NodeJS

Detaillierte Erklärung von Express in NodeJS

Mar 11, 2021 am 10:09 AM
express nodejs

Dieser Artikel stellt Ihnen Express in node vor. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

? json Das Feld „Start“ wird wie folgt geändert:

npm install nodemon -D
Nach dem Login kopieren
Detaillierte Erklärung von Express in NodeJS Aber jetzt finden wir ein Problem: Egal welche Änderungen an einer Datei vorgenommen werden, der Knoten wird neu gestartet.

Wir spezifizieren einfach: JS-Dateien überwachen:

Neue nodemon.json erstellen

"start":"nodemon js路径+名",
//增加一行
"start:node":"node js路径+名",
...
Nach dem Login kopieren

(src ist der Verzeichnisname auf der gleichen Ebene wie json (wo sich js befindet))

Danach kann der Server automatisch npm start.

Zurück zum Geschäft, Express ergreift Maßnahmen

Unser erstes Wissen über Express: ein Web-Framework in Node.

Wie folgt: Verwenden Sie Express, um eine Webanwendung zu erstellen

{
	"watch":["./src/**/*.js"]
}
Nach dem Login kopieren

Setzen Sie app.js im src-Verzeichnis (selbst erstellter Ordner) ein:npm start了。

言归正传,Express出手

我们对express的第一认知:node中的一种web框架。

如下:用express搭建一个web应用

npm install express -S       # "-S":在生产环境中搭载
npm install nodemon -D
Nach dem Login kopieren

在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('启动成功');
});
Nach dem Login kopieren

看到代码第3行,有没有想到http?
const server=http.createServer((req,res)=>{...});
这里的server和上面的app是一样的。但是两个req不一样,因为app的req是经过express封装过的,它的功能更丰富!

在package.json(生成的配置文件)中修改:

// "script"选项下第一个——"start"值中加一个“nodemon”字样:
"start":"nodemon ./src/app.js",
...
Nach dem Login kopieren

那如上代码怎么传参?

// get方式传参
app.get('/name/:age',(req,res)=>{
	let {age}=req.params;
	res.json({
		name:'tom',
		age
	})
})
Nach dem Login kopieren

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已启动');
});
Nach dem Login kopieren

路由API

定义一个api,需要满足 客户端 无论以什么请求方式,都可以得到响应

app.all('/demo',(req,res)=>{
	res.json({
		message:'demo',
		method:req.method
	})
});
Nach dem Login kopieren

无论客户端使用任何URI,我们的服务都可以响应(日志)

app.all('*',(req,res)=>{
	res.json({
		message:'demo',
		method:req.method,
		uri:req.path
	})
});
Nach dem Login kopieren

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
	})
});
Nach dem Login kopieren

如何做路由的拆分? —— 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;
Nach dem Login kopieren

在app.js中“ 注册路由 ”:

const memberRouter=require('./member.router.js');app.use(memberRouter);
Nach dem Login kopieren

现在我们再写一个skuRouter的路由,它的URI中也有“/list”。
注册完以后。我们发现找不到了(打印不出来),那这怎么办?

其实,路由use里面我们可以加一个“前缀”——也就是“根”,加以区分:

const memberRouter=require('./member.router.js');
app.use(memberRouter);
Nach dem Login kopieren

中间件

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>
Nach dem Login kopieren
npm install body-parser
Nach dem Login kopieren
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);
});
Nach dem Login kopieren

毫无疑问,这比平时“多出来的”一行: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();
	});
}
Nach dem Login kopieren

然后在其他文件里引用:

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);
});
Nach dem Login kopieren

异常处理

——可视化
通常,异常处理都是全局进行的。

一般做法:throw new Error('测试功能异常');

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最后,做中间件用
Nach dem Login kopieren

Sehen Sie sich die dritte Zeile des Codes an. Haben Sie an http gedacht? const server=http.createServer((req,res)=>{...});

Der Server hier ist derselbe wie die App oben. Die beiden Anforderungen sind jedoch unterschiedlich, da die Anforderungen der App durch Express gekapselt sind und über umfangreichere Funktionen verfügen!

Ändern Sie in package.json (generierte Konfigurationsdatei):
npm install express mysql2 sequelize nodemon sequelize-cli -S
Nach dem Login kopieren
Nach dem Login kopieren

Wie werden Parameter im obigen Code übergeben?

"database":"数据库表名",
"timezone":"+08:00"
Nach dem Login kopieren
Nach dem Login kopieren

Router-Einführung und Verwendung des

🎜🎜Webdienstes zur Verarbeitung einer Anfrage🎜🎜 URL --> DNS-Auflösung --> Typ: Disc;">
  • 🎜So antworten Sie auf diese Anfrage - Routing! (Regeln)🎜
  • 🎜Wie unterscheidet man – Anforderungsmethode (get/post), uri (Pfad)🎜
  • npx sequelize db:migrate
    Nach dem Login kopieren
    Nach dem Login kopieren
    🎜🎜Routing-API🎜🎜🎜Definieren Sie eine API, Bedarf Stellen Sie den Kunden zufrieden, egal welche Anfragemethode wir erhalten. Egal welche URI der Kunde verwendet, unser Dienst kann antworten (protokollieren). Wie teilt man das Routing auf? 🎜 —— express.Router🎜🎜In der Datei member.router.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;
    };
    Nach dem Login kopieren
    Nach dem Login kopieren
    🎜In app.js „🎜Register Route🎜“:🎜
    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)
    	}
    })
    Nach dem Login kopieren
    Nach dem Login kopieren
    🎜Jetzt schreiben wir eine weitere Route für skuRouter, und ihr URI hat auch „ /list ". 🎜 Nach Anmeldung. Wir stellen fest, dass wir es nicht finden können (es nicht ausdrucken können). Was sollen wir tun? 🎜🎜Tatsächlich können wir der Route ein „Präfix“ – also „root“ – hinzufügen, um sie zu unterscheiden: 🎜
    app.use((err,req,res,next)=>{
    	if(err){
    		res.status(500).json({
    			message:err.message
    		})
    	}
    })
    Nach dem Login kopieren
    Nach dem Login kopieren
    🎜🎜Middleware🎜🎜🎜🎜Express-Middleware🎜🎜🎜Verwendung: 🎜
    • 🎜Nutzung auf App-Ebene (bei der Registrierung muss sie sich auf der obersten Ebene/Ende befinden)🎜
    • 🎜Router-Ebene🎜
    • 🎜Ausnahmebehandlung 🎜
    🎜🎜 (gewöhnliche) Middleware 🎜🎜🎜 Wir sollten uns zunächst eine Frage stellen: Warum wird „Middleware“ benötigt: Das Programm kann nicht in einem Schritt „abgeschlossen“ werden. 🎜🎜Nehmen Sie zum Beispiel die folgende Demo: Holen Sie sich den Eingabeinhalt: 🎜rrreeerrreeerrreee🎜 Es ​​besteht kein Zweifel, dass dies eine „zusätzliche“ Zeile als üblich ist: server.use(bodyParser,urlencoded({})); Es handelt sich um den sogenannten „Einsatz von Middleware“. 🎜🎜Jetzt ist es an der Zeit, über eine weitere Frage nachzudenken: Warum kann das Programm nicht in einem Schritt abgeschlossen werden? 🎜 Sollte wie im obigen Code „body“ in der Anforderung von POST enthalten sein? 🎜 Offensichtlich sollte es nicht so sein. Der Körper existiert überhaupt nicht! (Sonst nutzen wir noch Daten für Ajax?) 🎜🎜Aber wir brauchen sie jetzt wirklich. Zeile 2 <code>const bodyParser=require('body-parser'); gilt also für das „Middleware-Modul“ und Zeile 5 gibt die gesamte „Kettenoperation“ (zwei verbundene Verwendungen) an „ Installierte einen Körper . 🎜
    🎜Im Allgemeinen werden wir im tatsächlichen Kampf drei Middlewares schreiben, um eine „vollständige“ Parameter-Parsing-Methode zu bilden: 🎜app.use(express.json());🎜 app.use(express.urlencoded());🎜app.use(bodyParser,urlencoded({extended:true}));🎜//Dann noch einmal get/post Operation🎜
    🎜Wenn sich die vorherige Übermittlung im GET-Modus befindet, verwenden Sie natürlich einfach req.query direkt im Knoten, sodass keine Middleware erforderlich ist. 🎜🎜Da Middleware so „nützlich“ ist, warum nicht selbst eine kapseln? 🎜🎜mxc-body-parser.js-Datei🎜🎜rrreee🎜Dann referenzieren Sie sie in anderen Dateien:🎜rrreee🎜🎜Ausnahmebehandlung🎜🎜🎜——Visualisierung🎜 Normalerweise erfolgt die Ausnahmebehandlung global. 🎜🎜Allgemeiner Ansatz: throw new Error('test function Exception');🎜 Node-Express integrierte Ausnahmebehandlung: 🎜rrreee🎜🎜ORM-Modellerstellung im tatsächlichen Kampf🎜🎜🎜🎜Lass uns darüber reden Zuerst die Datenbankinitialisierung 🎜🎜🎜Nachdem wir MySQL erstellt haben, müssen wir Knoten und MySQL verbinden. Die verwendeten Tools: 🎜
    npm install express mysql2 sequelize nodemon sequelize-cli -S
    Nach dem Login kopieren
    Nach dem Login kopieren

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

    "database":"数据库表名",
    "timezone":"+08:00"
    Nach dem Login kopieren
    Nach dem Login kopieren

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

    npx sequelize db:migrate
    Nach dem Login kopieren
    Nach dem Login kopieren

    前端数据如何往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;
    };
    Nach dem Login kopieren
    Nach dem Login kopieren

    使用:创建第一个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)
    	}
    })
    Nach dem Login kopieren
    Nach dem Login kopieren

    最后的next传给谁?

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

    app.use((err,req,res,next)=>{
    	if(err){
    		res.status(500).json({
    			message:err.message
    		})
    	}
    })
    Nach dem Login kopieren
    Nach dem Login kopieren

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

    Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung von Express in NodeJS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

    Heiße KI -Werkzeuge

    Undresser.AI Undress

    Undresser.AI Undress

    KI-gestützte App zum Erstellen realistischer Aktfotos

    AI Clothes Remover

    AI Clothes Remover

    Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

    Undress AI Tool

    Undress AI Tool

    Ausziehbilder kostenlos

    Clothoff.io

    Clothoff.io

    KI-Kleiderentferner

    AI Hentai Generator

    AI Hentai Generator

    Erstellen Sie kostenlos Ai Hentai.

    Heißer Artikel

    R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Beste grafische Einstellungen
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25: Wie man alles in Myrise freischaltet
    4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

    Heiße Werkzeuge

    Notepad++7.3.1

    Notepad++7.3.1

    Einfach zu bedienender und kostenloser Code-Editor

    SublimeText3 chinesische Version

    SublimeText3 chinesische Version

    Chinesische Version, sehr einfach zu bedienen

    Senden Sie Studio 13.0.1

    Senden Sie Studio 13.0.1

    Leistungsstarke integrierte PHP-Entwicklungsumgebung

    Dreamweaver CS6

    Dreamweaver CS6

    Visuelle Webentwicklungstools

    SublimeText3 Mac-Version

    SublimeText3 Mac-Version

    Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

    Ist NodeJS ein Backend-Framework? Ist NodeJS ein Backend-Framework? Apr 21, 2024 am 05:09 AM

    Node.js kann als Backend-Framework verwendet werden, da es Funktionen wie hohe Leistung, Skalierbarkeit, plattformübergreifende Unterstützung, ein umfangreiches Ökosystem und einfache Entwicklung bietet.

    So verbinden Sie NodeJS mit der MySQL-Datenbank So verbinden Sie NodeJS mit der MySQL-Datenbank Apr 21, 2024 am 06:13 AM

    Um eine Verbindung zu einer MySQL-Datenbank herzustellen, müssen Sie die folgenden Schritte ausführen: Installieren Sie den MySQL2-Treiber. Verwenden Sie mysql2.createConnection(), um ein Verbindungsobjekt zu erstellen, das die Hostadresse, den Port, den Benutzernamen, das Passwort und den Datenbanknamen enthält. Verwenden Sie „connection.query()“, um Abfragen durchzuführen. Verwenden Sie abschließend Connection.end(), um die Verbindung zu beenden.

    Was sind die globalen Variablen in NodeJS? Was sind die globalen Variablen in NodeJS? Apr 21, 2024 am 04:54 AM

    Die folgenden globalen Variablen sind in Node.js vorhanden: Globales Objekt: global Kernmodul: Prozess, Konsole, erforderlich Laufzeitumgebungsvariablen: __dirname, __filename, __line, __column Konstanten: undefiniert, null, NaN, Infinity, -Infinity

    Gibt es einen großen Unterschied zwischen NodeJS und Java? Gibt es einen großen Unterschied zwischen NodeJS und Java? Apr 21, 2024 am 06:12 AM

    Die Hauptunterschiede zwischen Node.js und Java sind Design und Funktionen: Ereignisgesteuert vs. Thread-gesteuert: Node.js ist ereignisgesteuert und Java ist Thread-gesteuert. Single-Threaded vs. Multi-Threaded: Node.js verwendet eine Single-Threaded-Ereignisschleife und Java verwendet eine Multithread-Architektur. Laufzeitumgebung: Node.js läuft auf der V8-JavaScript-Engine, während Java auf der JVM läuft. Syntax: Node.js verwendet JavaScript-Syntax, während Java Java-Syntax verwendet. Zweck: Node.js eignet sich für I/O-intensive Aufgaben, während Java für große Unternehmensanwendungen geeignet ist.

    Was ist der Unterschied zwischen den Dateien npm und npm.cmd im Installationsverzeichnis von nodejs? Was ist der Unterschied zwischen den Dateien npm und npm.cmd im Installationsverzeichnis von nodejs? Apr 21, 2024 am 05:18 AM

    Es gibt zwei npm-bezogene Dateien im Node.js-Installationsverzeichnis: npm und npm.cmd. Die Unterschiede sind wie folgt: unterschiedliche Erweiterungen: npm ist eine ausführbare Datei und npm.cmd ist eine Befehlsfensterverknüpfung. Windows-Benutzer: npm.cmd kann über die Eingabeaufforderung verwendet werden, npm kann nur über die Befehlszeile ausgeführt werden. Kompatibilität: npm.cmd ist spezifisch für Windows-Systeme, npm ist plattformübergreifend verfügbar. Nutzungsempfehlungen: Windows-Benutzer verwenden npm.cmd, andere Betriebssysteme verwenden npm.

    Ist NodeJS eine Back-End-Entwicklungssprache? Ist NodeJS eine Back-End-Entwicklungssprache? Apr 21, 2024 am 05:09 AM

    Ja, Node.js ist eine Backend-Entwicklungssprache. Es wird für die Back-End-Entwicklung verwendet, einschließlich der Handhabung serverseitiger Geschäftslogik, der Verwaltung von Datenbankverbindungen und der Bereitstellung von APIs.

    So stellen Sie das NodeJS-Projekt auf dem Server bereit So stellen Sie das NodeJS-Projekt auf dem Server bereit Apr 21, 2024 am 04:40 AM

    Serverbereitstellungsschritte für ein Node.js-Projekt: Bereiten Sie die Bereitstellungsumgebung vor: Erhalten Sie Serverzugriff, installieren Sie Node.js, richten Sie ein Git-Repository ein. Erstellen Sie die Anwendung: Verwenden Sie npm run build, um bereitstellbaren Code und Abhängigkeiten zu generieren. Code auf den Server hochladen: über Git oder File Transfer Protocol. Abhängigkeiten installieren: Stellen Sie eine SSH-Verbindung zum Server her und installieren Sie Anwendungsabhängigkeiten mit npm install. Starten Sie die Anwendung: Verwenden Sie einen Befehl wie node index.js, um die Anwendung zu starten, oder verwenden Sie einen Prozessmanager wie pm2. Konfigurieren Sie einen Reverse-Proxy (optional): Verwenden Sie einen Reverse-Proxy wie Nginx oder Apache, um den Datenverkehr an Ihre Anwendung weiterzuleiten

    Welches soll man zwischen NodeJS und Java wählen? Welches soll man zwischen NodeJS und Java wählen? Apr 21, 2024 am 04:40 AM

    Node.js und Java haben jeweils ihre Vor- und Nachteile in der Webentwicklung, und die Wahl hängt von den Projektanforderungen ab. Node.js zeichnet sich durch Echtzeitanwendungen, schnelle Entwicklung und Microservices-Architektur aus, während Java sich durch Support, Leistung und Sicherheit auf Unternehmensniveau auszeichnet.

    See all articles