1. 程式人生 > >express中的get post use處理,鏈式操作,封裝中介軟體

express中的get post use處理,鏈式操作,封裝中介軟體

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提交的資料

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