mvc測(cè)試Api流程

一.什么是Express汰翠?

Express是最流行的Node框架家浇,是許多其他流行 Node框架的底層庫(kù)

1.Express框架核心特性

  • 可以設(shè)置中間件來(lái)響應(yīng)HTTP請(qǐng)求

  • 定義了路由表用于執(zhí)行不同的HTTP請(qǐng)求動(dòng)作

  • 可以通過(guò)向模板傳遞參數(shù)來(lái)動(dòng)態(tài)渲染HTML頁(yè)面。

二.安裝express

1.express 肯定基于在node 環(huán)境中安裝翁垂,我們可以通過(guò)終端輸入npm -v來(lái)查看我們是否安裝了node環(huán)境

2.通過(guò)終端來(lái)安裝express框架(全局下安裝)


1匀油、npm install -g express

2凑懂、npm install -g express-generator

三.express創(chuàng)建項(xiàng)目

1.express項(xiàng)目名

2.執(zhí)行完畢后終端會(huì)出現(xiàn)步驟螺句,按照下面的步驟依次執(zhí)行

image.png

執(zhí)行完之后會(huì)在本地文件夾中創(chuàng)建好項(xiàng)目

image.png
  • 文件

app.js : 是工程的配置文件

bin : 創(chuàng)建服務(wù)器的文件夾

node_modules :是安裝node后用來(lái)存放包管理器虽惭,下載安裝包的文件夾

public : 把所有的靜態(tài)資源(html或者css之類的) 指定放置到入口文件

routes : 路由,儲(chǔ)存數(shù)據(jù)

views : 是創(chuàng)建express項(xiàng)目自帶的jade文件

3.通過(guò)終端安裝熱更新

在終端輸入npm install nodemon

安裝好之后蛇尚,找到package.json文件芽唇,將start下的node改為 nodemon

4.通過(guò)終端安裝模板引擎(使用jade就不用安裝,這里使用的是html)


npm install express-art-template

安裝好以后需要更改在文件夾中的名字

  • 4.1 首先得找到app.js,在設(shè)置模板引擎前引入引擎(view enginer setup(視圖引擎設(shè)置))

  • 4.2 在設(shè)置模板引擎中的jade改為html

image.png

5.啟動(dòng)項(xiàng)目


npm start

6.查看項(xiàng)目

  • 輸入本地路徑取劫,端口號(hào)為3000

在瀏覽器輸入127.0匆笤。0.1:3000

創(chuàng)建數(shù)據(jù)庫(kù),mvc流程

  • 一.mvc組成:由model谱邪、view炮捧、controller組成

1.model: 負(fù)責(zé)跟數(shù)據(jù)庫(kù)映射(一個(gè)變量映射一個(gè)表)關(guān)系的操作數(shù)據(jù)庫(kù)

2.view:前端頁(yè)面的渲染(也叫視圖層)

3.controller: 控制層,富足對(duì)數(shù)據(jù)庫(kù)進(jìn)行處理惦银,前端給后端發(fā)送的請(qǐng)求(req)和后端給前端發(fā)送的響應(yīng)(res)都要在controller層處理

最終由API創(chuàng)建路徑咆课,同時(shí)調(diào)用controller層的方法,完成整個(gè)接口開(kāi)發(fā)

  • 二. mvc中文件的關(guān)系

1.一個(gè)model文件對(duì)應(yīng)一個(gè)server文件

2.一個(gè)server文件對(duì)應(yīng)一個(gè)controller文件

3.一個(gè)controller文件對(duì)應(yīng)一個(gè)API文件

4.這些文件名都要保持一致扯俱,方便維護(hù)

7.在當(dāng)前項(xiàng)目中創(chuàng)建一個(gè)config文件夾傀蚌,用來(lái)建立數(shù)據(jù)庫(kù)

  • 創(chuàng)建database.js文件

database.js 文件導(dǎo)出的是一個(gè)對(duì)象,對(duì)象中包含著所有跟數(shù)據(jù)庫(kù)有關(guān)的參數(shù)


//導(dǎo)出

module.exports={

  database : 'data', //數(shù)據(jù)庫(kù)名

  username:'root', //數(shù)據(jù)庫(kù)用戶名

  password:' ', //數(shù)據(jù)庫(kù)密碼蘸吓,沒(méi)有設(shè)置就是為空

  dialect  :'mysql', //數(shù)據(jù)庫(kù)

  host:'localhost', // 數(shù)據(jù)庫(kù)主機(jī)名

  port:'3306',//數(shù)據(jù)庫(kù)端口號(hào),//數(shù)據(jù)庫(kù)端口號(hào)  navicat中是多少就寫(xiě)多少善炫,如果被占用可以更改(3000-9000)

timezone:'+08:00';//中國(guó)時(shí)區(qū)//因?yàn)橹袊?guó)事件采用東八時(shí)區(qū)的

}



//pool 數(shù)據(jù)庫(kù)連接池库继,減少數(shù)據(jù)庫(kù)壓力

pool : {

  max : 10,

  min: 0,

acquire : 

}

在當(dāng)前項(xiàng)目中箩艺,通過(guò)終端安裝sequelize模塊

8.我可以在pages文件夾創(chuàng)建一個(gè)page.html∠芴眩可以通過(guò)這個(gè)文件夾賴家成html模板艺谆,方便我們寫(xiě)代碼

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

    <link rel="stylesheet" href="stylesheets/style.css">

    <link rel="stylesheet" href="stylesheets/{{file}}.css">



    {{block 'head'}}{{/block}}

</head>

<body>

    {{block 'content'}}{{/block}}

</body>

<script src="javascripts/{{file}}.js"></script>

</html>

  • 在路由的文件中設(shè)置file

file這一條鍵值對(duì)是當(dāng)前頁(yè)面下所說(shuō)的css 和 js的文件名

image.png
  • 在其他頁(yè)面中繼承page.html

{{extend './page.html '}}//extend 繼承

{{block 'content'}}

  <h1>這里繼承了page中的模板</h1>

{{/block}}

9.在當(dāng)前項(xiàng)目中創(chuàng)建model 文件夾,用來(lái)映射數(shù)據(jù)表

  • 創(chuàng)建index.js

1.sequelize 模塊拜英,并解析出Sequelize和 Datatypes

2.導(dǎo)出數(shù)據(jù)庫(kù)設(shè)置模塊(config/database)

3.實(shí)例化數(shù)據(jù)庫(kù)對(duì)象

4.引入數(shù)據(jù)庫(kù)

5.更新數(shù)據(jù)庫(kù)

6.導(dǎo)出數(shù)據(jù)表


//引入sequelize模塊

let {Sequelize,DataTypes} = require('sequelize');



//引入數(shù)據(jù)庫(kù)設(shè)置 (require 引入)

let db = require ('../config/database');



//實(shí)例化數(shù)據(jù)庫(kù)對(duì)象

let sequelize = new Sequelize(db)静汤;



//引入數(shù)據(jù)表

let user  = require('../user')(sequelize,DataTypes);



//更新數(shù)據(jù)庫(kù)

sequelize.sync()';

 

//導(dǎo)出數(shù)據(jù)表

  module.exports = {

  user,

}

  • 創(chuàng)建數(shù)據(jù)表文件user.js
  • 設(shè)置數(shù)據(jù)表

    1.文件名跟數(shù)據(jù)表名保持一致,此文件導(dǎo)出的是一個(gè)方法

2.每一個(gè)字段都是一個(gè)對(duì)象居凶,字段名就是這個(gè)對(duì)象的key

3.設(shè)置id虫给,需要設(shè)置主鍵和主鍵自動(dòng)遞增


//直接返回一個(gè)方法

module.exports = (sequelize, DataTypes) => sequelize.define('user', {

    //sequelize.define() 是sequelize插件對(duì)數(shù)據(jù)表的映射方法

    //第一個(gè)參數(shù)是表名

    //第二個(gè)參數(shù)是表字段的設(shè)置

    //每一個(gè)字段都是一個(gè)對(duì)象,字段名就是這個(gè)對(duì)象的key

    user_id: {

        type: DataTypes.INTEGER(11), //設(shè)置字段數(shù)據(jù)類型

        allowNull: false, //不允許為空

        primaryKey : true,  //設(shè)置主鍵

        autoIncrement : true, //設(shè)置主鍵自動(dòng)遞增

    },

    username:{

        type: DataTypes.STRING, //設(shè)置字段數(shù)據(jù)類型

        allowNull: false, //不允許為空

        unique : true, //設(shè)置唯一性

    },

    password : {

        type: DataTypes.STRING, //設(shè)置字段數(shù)據(jù)類型

        allowNull: false, //不允許為空

    },

    phone : {

        type: DataTypes.STRING, //設(shè)置字段數(shù)據(jù)類型

        allowNull: false, //不允許為空

        unique : true, //設(shè)置唯一性

    },



});



10.在當(dāng)前項(xiàng)目創(chuàng)建server文件夾侠碧,用來(lái)操作數(shù)據(jù)表

  • 引入model表的映射

  • 設(shè)置添加用戶的方法

  • 1.方法中抹估,會(huì)將前端發(fā)送過(guò)來(lái)的數(shù)據(jù)(req.body/req.query)發(fā)送給數(shù)據(jù)庫(kù),并將數(shù)據(jù)庫(kù)返回的信息發(fā)送給前端(以回調(diào)函數(shù)的形式)

第一個(gè)參數(shù)是前端發(fā)送過(guò)來(lái)的數(shù)據(jù)

第二個(gè)參數(shù)是回調(diào)函數(shù)

req代表請(qǐng)求

1.post 請(qǐng)求使用req.body 來(lái)接收

2.get 請(qǐng)求使用req.query

res代表響應(yīng)

  • 3.如果數(shù)據(jù)添加成功弄兜,temp會(huì)接收到一個(gè)返回值(成功信息)

  • 4.把所有數(shù)據(jù)庫(kù)的操作方法以對(duì)象的形式導(dǎo)出

  • 創(chuàng)建user.js文件


//引入model表的映射

let model = require('../model'); //index可以省略不寫(xiě),其他的不可以省略



//聲明一個(gè)變量 接收user表

let user = model.user;



//添加用戶的方法

function addUser(obj,callback){

    let temp = user.create({

        username : obj.username,

        password : obj.password,

        phone : obj.phone,

    });

    // 如果數(shù)據(jù)添加成功药蜻,temp會(huì)接收到一個(gè)返回值(成功信息)

    //如果失敗瓷式,temp不會(huì)接收到任何東西

    var data;

    if(temp){

        //成功

        data = {

            msg : 'success',

            code : 1,

        }

    }else{

        //失敗

        data = {

            msg : 'error',

            code : 0,

        }

    }

    callback(data);

}



module.exports = {

    addUser,

}

11.在當(dāng)前項(xiàng)目創(chuàng)建 controller 文件夾,用來(lái)做前后端交互语泽,數(shù)據(jù)處理

  • 引入server表的操作

  • 設(shè)置添加用戶的數(shù)據(jù)處理

  • 在定義的數(shù)據(jù)處理方法中調(diào)用

  1. server方法中第一個(gè)參數(shù)req.body / req.query

2.server 方法中第二個(gè)參數(shù)贸典,回調(diào)函數(shù),在回調(diào)函數(shù)中以res.send() 向前端發(fā)送數(shù)據(jù)server方法踱卵。

  • 將所有的數(shù)據(jù)處理方法以對(duì)象的形式導(dǎo)出

  • 創(chuàng)建suer.js文件


//交互,數(shù)據(jù)處理   server => contorller



//引入 server表的操作

let user = require('../server/user');



//添加用戶的數(shù)據(jù)處理

function c_addUser(req,res){

    user.addUser(req.body,function(data){

        res.send(data);

    })

}



module.exports = {

    c_addUser,

}

12.在當(dāng)前項(xiàng)目中創(chuàng)建 api 文件夾 這是一個(gè)接口

  • api是傳給前端

  • 引入controller控制器

  • 設(shè)置添加用戶API

  • 使用express 中的路由模塊來(lái)設(shè)置api路徑

  • 使用router 中 get /post方法 定義api 路徑和請(qǐng)求方法

  • 導(dǎo)出路由模塊 router

  • 找到app.js文件瓤漏,在里面設(shè)置引入API、掛載API

1.引入API


//引入API

var userApi = require('./api/user')颊埃;

image.png

2.API掛載


//API 掛載

app.use('/userapi,userApi')

image.png
  • 創(chuàng)建user.js文件


//接口 controller => api 

//api 傳給前端



var express = require('express');

var router = express.Router( );



var express = require('express');

var router = express.Router ( );



//引入controller 控制器

let user = require(' ../controller/user');



//設(shè)置添加用戶ApI

router.post('./add',user.c_addUser);



module.exports = router

13.最后在使用終端蔬充,在本項(xiàng)目中安裝mysql2依賴,然后啟動(dòng)項(xiàng)目


npm install mysql2



npm start

以上就是創(chuàng)建一個(gè)express項(xiàng)目的完整步驟

express 是一個(gè)經(jīng)典的mvc架構(gòu)
  • 這是所有express創(chuàng)建好的所有文件夾目錄

image.png
  • 整個(gè)過(guò)程

前端 => Api => controller = > server = > model => 后端

四. 測(cè)試接口

  • 寫(xiě)好接口之后要進(jìn)行測(cè)試班利,看是否可以正常使用

  • 通過(guò)瀏覽器的插件進(jìn)行測(cè)試(apizza)

image.png

1.點(diǎn)擊發(fā)送進(jìn)行測(cè)試饥漫,如果接口可以使用,則返回成功罗标,(這是自定義的返回方法的返回值)

image.png

2.點(diǎn)擊發(fā)送進(jìn)行測(cè)試庸队,如果接口不可以使用,則會(huì)返回失敗

image.png

3.然后可以看到數(shù)據(jù)庫(kù)中可以查看我們新建的數(shù)據(jù)表

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末闯割,一起剝皮案震驚了整個(gè)濱河市彻消,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宙拉,老刑警劉巖宾尚,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谢澈,居然都是意外死亡煌贴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)锥忿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)牛郑,“玉大人,你說(shuō)我怎么就攤上這事敬鬓⊙团螅” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵钉答,是天一觀的道長(zhǎng)础芍。 經(jīng)常有香客問(wèn)我,道長(zhǎng)希痴,這世上最難降的妖魔是什么者甲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任春感,我火速辦了婚禮砌创,結(jié)果婚禮上虏缸,老公的妹妹穿的比我還像新娘。我一直安慰自己嫩实,他們只是感情好刽辙,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著甲献,像睡著了一般宰缤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晃洒,一...
    開(kāi)封第一講書(shū)人閱讀 52,807評(píng)論 1 314
  • 那天慨灭,我揣著相機(jī)與錄音,去河邊找鬼球及。 笑死氧骤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吃引。 我是一名探鬼主播筹陵,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼镊尺!你這毒婦竟也來(lái)了朦佩?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤庐氮,失蹤者是張志新(化名)和其女友劉穎语稠,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體弄砍,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颅筋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了输枯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片议泵。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖桃熄,靈堂內(nèi)的尸體忽然破棺而出先口,到底是詐尸還是另有隱情,我是刑警寧澤瞳收,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布碉京,位于F島的核電站,受9級(jí)特大地震影響螟深,放射性物質(zhì)發(fā)生泄漏谐宙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一界弧、第九天 我趴在偏房一處隱蔽的房頂上張望凡蜻。 院中可真熱鬧搭综,春花似錦、人聲如沸划栓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)忠荞。三九已至蒋歌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間委煤,已是汗流浹背堂油。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碧绞,地道東北人称诗。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像头遭,于是被迫代替她去往敵國(guó)和親寓免。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1. mvc設(shè)計(jì)模式的構(gòu)成 model(業(yè)務(wù)模型) ? ? 負(fù)責(zé)與數(shù)據(jù)庫(kù)建立映射關(guān)系 和 操作數(shù)據(jù)庫(kù) view...
    達(dá)布干m閱讀 163評(píng)論 0 0
  • MVC 是什么计维?MVC構(gòu)成:model負(fù)責(zé)跟數(shù)據(jù)庫(kù)建立映射關(guān)系和操作數(shù)據(jù)庫(kù)由于model層有兩個(gè)功能 所以將其分為...
    Delet閱讀 119評(píng)論 0 0
  • MVC是什么袜香? 1.model負(fù)責(zé)跟數(shù)據(jù)庫(kù)建立映射關(guān)系和操作數(shù)據(jù)庫(kù)由于model有兩個(gè)功能,所以將其劃分為mode...
    熙攘_ym閱讀 152評(píng)論 0 0
  • 博客說(shuō)明 本博客翻譯自Node.js - Role Based Authorization Tutorial wi...
    雪域迷影閱讀 418評(píng)論 0 0
  • 本文翻譯自Node.js Rest APIs example with Express, Sequelize & ...
    雪域迷影閱讀 1,686評(píng)論 0 3