ホームページ  >  記事  >  ウェブフロントエンド  >  Nodejsのexpressの詳しい説明

Nodejsのexpressの詳しい説明

青灯夜游
青灯夜游転載
2021-03-11 10:09:252695ブラウズ

この記事では、node での Express について紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

Nodejsのexpressの詳しい説明

関連する推奨事項: 「

nodejs チュートリアル

その前に、非常に便利なノードであるノードデーモンについてお話しましょう> ; 自動コンパイル

npm install nodemon -D
の後、構成ファイル json の「script」オプションの「start」フィールドを次のように変更します:

"start":"nodemon js路径+名",
//增加一行
"start:node":"node js路径+名",
...
しかし、ここで問題が見つかりました。を使用すると、変更を加えるとノードが再起動されます。

指定するだけです: js ファイルを監視します:

新しい nodemon.json を作成します

{
	"watch":["./src/**/*.js"]
}
(src は json と同じレベルにあります (ここで、jsが見つかります) ディレクトリ名)

これ以降、サーバーは自動的に

npm start を実行できます。

トピックに戻り、Express はアクションを実行します。

Express についての最初の理解: ノード内の Web フレームワーク。

次のように: Express を使用して Web アプリケーションを構築します。

npm install express -S       # "-S":在生产环境中搭载
npm install nodemon -D
app.js を src ディレクトリ (自己構築フォルダー) に設定します:

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)=>{...}); ここのサーバーは上記のアプリと同じです。ただし、アプリの req は Express によってカプセル化されており、Express の方が豊富な機能を備えているため、2 つの req は異なります。

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

ルーターの概要と

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 を使用しても、サービスは応答できます ( log)

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 "

Register Route":

const memberRouter=require('./member.router.js');app.use(memberRouter);
次に、skuRouter の別のルートを作成します。これも URI に「/list」が含まれています。

登録後。見つからない(印刷できない)場合はどうすればよいですか?

実際、ルーティング使用に「プレフィックス」、つまり「ルート」を追加して区別することができます。

const memberRouter=require('./member.router.js');
app.use(memberRouter);

ミドルウェア

express ミドルウェア

使用法:

  • アプリ レベルの使用法 (登録時は最上位/末尾にある必要があります)

  • ルーター レベル

  • ##例外処理
  • ##(通常) ミドルウェア

#最初に、なぜ「ミドルウェア」が必要なのかという質問を考えてみましょう。プログラムは 1 ステップで「完了」することはできません。

たとえば、次のデモを見てみましょう: 入力コンテンツを取得します:

<!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({ }));

は、いわゆる「ミドルウェアの使用」です。

ここで別の質問について考えてみましょう。プログラムはなぜ「1 ステップで完了できない」のでしょうか? 上記のコードのように、POST の req に「body」を含める必要がありますか?

もちろんそうではありません。肉体はそもそも存在しない! (そうでない場合、ajax は依然としてデータを使用しますか?)


しかし、今はそれが本当に必要です。したがって、2 行目
const bodyParser=require('body-parser');

は「ミドルウェア モジュール」に適用され、5 行目では「チェーン操作」全体 (2 つの使用が接続されている) が「install」に与えられます。体に乗りました。

一般に、実際の戦闘では、「完全な」パラメータ解析メソッドを形成する 3 つのミドルウェアを作成します。

app.use(express.json()) ;


app.use(express.urlencoded());
app.use(bodyParser,urlencoded({extended:true}));
//その後、get/post オペレーション
もちろん、前の送信が GET モードの場合は、ノード内で

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 組み込み例外処理: <pre class="brush:php;toolbar:false">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最后,做中间件用</pre>
ORM in実戦モデルの作成

まずデータベースの初期化について話しましょう

mysql を作成した後、ノードを 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。