91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

nodejs中express是什么

發布時間:2021-03-11 10:42:56 來源:億速云 閱讀:268 作者:小新 欄目:web開發

這篇文章主要介紹nodejs中express是什么,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

                                                       本篇文章給大家介紹一下node中的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是什么”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

深圳市| 杭州市| 江西省| 酒泉市| 高雄县| 斗六市| 西林县| 喀喇沁旗| 肥乡县| 绥江县| 蕲春县| 台北县| 开封县| 成都市| 视频| 绥化市| 日喀则市| 于都县| 榆中县| 莲花县| 阳春市| 长寿区| 乌兰县| 新河县| 商都县| 宝清县| 桐庐县| 克东县| 开鲁县| 浑源县| 若羌县| 墨玉县| 德保县| 衢州市| 宁蒗| 从江县| 宜州市| 新泰市| 安新县| 龙门县| 通道|