express中的get post use處理,鏈式操作,封裝中介軟體
阿新 • • 發佈:2019-02-09
1、在express中的get處理表單處理的資料,即伺服器獲取get方式提交的資料,通過req.query獲取提交的資料,格式是json
// 客戶端程式碼 <!doctype html> <html> <head> <meta charset="utf-8"/> </head> <body> <form action='http://localhost:8080' method="get"> 使用者名稱:<input type='text' name="user" value=''><br /> 密碼:<input type='password' name="pass" value=""/><br /> <input type="submit" value='提交'> </form> </body> </html> // 服務端的程式碼 const express = require('express'); let server = express(); server.listen(8080); //get server.get('/',(req,res)=>{ console.log(req.query); });
或者通過use()處理get請求,客戶端程式碼同上
// 服務端的程式碼
const express = require('express');
let server = express();
server.listen(8080);
//get
server.use('/',(req,res)=>{
console.log(req.query);
});
2、在express中處理post方式的資料,需要引進外掛body-parser(只能解析資料,不能解析上傳的檔案,解析post資料,enctype='application/x-www-form-urlencoded'),然後通過req.body
POST的用途:上傳資料;解析上傳檔案
關鍵步驟
const bodyParser = require('body-parser');
server.use(bodyParser.urlencoded({}));
//req.body
const express = require('express'); // 引進外掛 const bodyParser = require('body-parser'); let server = express(); server.listen(8080); //post需要body-parser解析body server.use(bodyParser.urlencoded({})); //post server.post('/',(req,res)=>{ // req.body獲取客戶端遞交的資料 console.log(req.body); }); // 或者寫成下面的形式 server.use('/',(req,res)=>{ console.log(req.body); });
總之:req.query---獲取get方式的資料(不需要中間價),req.body----獲取post方式的資料(需要中介軟體body-parser)
3、處理上傳的檔案:中介軟體multer處理enctype='multipart/form-data',解析post檔案
const multer = require('multer');
// 定義上傳的檔案的路徑
let multerObj = multer({dest:'./www/upload/'});
server.use(multerObj.any());
server.post('/',(req,res)=>{
// 上傳的檔案
console.log(req.files[0]);
});
//輸出
{ fieldname: 'uploadFile',
originalname: 'FunwallIndex.jpg',
encoding: '7bit',
mimetype: 'image/jpeg',
destination: './www/upload/',
filename: 'db8542dc66f39ace324aa21d6e274bcc',
path: 'www\\upload\\db8542dc66f39ace324aa21d6e274bcc',
size: 28070
}
需要利用fs.rename('原檔名',‘修改後的檔名’,callback)函式給上傳的檔案重新命名
// 新檔名 名 獲取原始檔案的副檔名
let newName = req.files[0].path + pathLib.extname(req.files[0].originalname);
// let newName = req.files[0].originalname;
// 重新命名
fs.rename(req.files[0].path,newName,(err)=>{
if(err){
console.log('error');
res.send('lose');
}else{
console.log('success');
res.send('success');
}
});
完整的解析Post檔案例子
//後臺
const express = require('express');
const multer = require('multer');
const fs = require('fs');
const pathLib = require('path');
let server = express();
// 定義上傳的檔案的路徑
let multerObj = multer({dest:'./www/upload/'});
server.listen(8080);
server.use(multerObj.any());
server.post('/',(req,res)=>{
// 上傳的檔案
console.log(req.files[0]);
console.log(req.files[0].originalname);
// 新檔名 名 獲取原始檔案的副檔名
let newName = req.files[0].path + pathLib.extname(req.files[0].originalname);
// let newName = req.files[0].originalname;
// 重新命名
fs.rename(req.files[0].path,newName,(err)=>{
if(err){
console.log('error');
res.send('lose');
}else{
console.log('success');
res.send('success');
}
});
});
//前臺
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<form action='http://localhost:8080/' method="post" enctype="multipart/form-data">
<!-- 使用者名稱:<input type='text' name="user" value=''><br />
密碼:<input type='password' name="pass" value=""/><br /> -->
上傳檔案:<input type='file' name="uploadFile" value=""/><br />
<input type="submit" value='上傳'>
</form>
</body>
</html>
3、express中的鏈式操作,use post get都有next引數(option)
通過(req,res.next)=>{}中的next()呼叫,如果有鏈式操作,就呼叫next(),否則不呼叫
const express = require('express');
let server = express();
server.listen(8080);
server.use('/',(req,res,next)=>{
console.log('a');
next();
});
server.use('/',(req,res,next)=>{
console.log('b');
});
輸出結果:a,b
4、自己寫個中介軟體
使用next()在給req新增屬性
// 鏈式寫法 + 外掛的寫法
const express = require('express');
let server = express();
server.listen(8080);
// 響應所有的請求
server.use((req,res,next)=>{
req.body = 12;
req.a = 'dd';
// 鏈式呼叫
next();
});
// 響應根目錄下的請求
server.use('/',(req,res)=>{
console.log(req.body);
console.log(req.a);
});
輸出:12 dd
自己實現body-parser,收集資料,將資料新增到新增的屬性裡面
// 鏈式寫法 + 外掛的寫法
const express = require('express');
// 解析字串為json
const querystring = require('querystring');
let server = express();
server.listen(8080);
// 響應所有的請求
// 實現中介軟體
server.use((req,res,next)=>{
let str = '';
//收集資料
req.on('data',(data)=>{
str += data;
});
//將資料新增自定義的屬性
req.on('end',()=>{
// 將字串解析為json
req.body = querystring.parse(str);
// 鏈式呼叫
next();
});
});
// 響應根目錄下的請求
server.use('/',(req,res)=>{
console.log(req.body);
});
封裝成模組:
// 鏈式寫法 + 外掛的寫法
const express = require('express');
// 解析字串為json
const querystring = require('querystring');
let server = express();
server.listen(8080);
// 響應所有的請求
// 實現中介軟體
server.use((req,res,next)=>{
let str = '';
//收集資料
req.on('data',(data)=>{
str += data;
});
//將資料新增自定義的屬性
req.on('end',()=>{
// 將字串解析為json
req.body = querystring.parse(str);
// 鏈式呼叫
next();
});
});
// 響應根目錄下的請求
server.use('/',(req,res)=>{
console.log(req.body);
});