NodeJS實現(xiàn)Oauth2.0 RESTful API(2. CRUD)

上一節(jié)中我們實現(xiàn)了一個基本的Node應用锦庸,它可以接受HTTP請求并返回靜態(tài)的JSON。在這一節(jié)中闰非,將對我們的寵物數(shù)據(jù)增加CRUD操作膘格。我們要學習如何連接MongoDB,使用Mongoose進行對象建模财松,實現(xiàn)GET,PUT,POST和DELETE接口瘪贱。

連接MongoDB

如果你還沒有安裝MongoDB,請登錄Mongo官網(wǎng)下載辆毡。

我們需要執(zhí)行三步來連接MongoDB:

  1. 安裝Mongoose包
  2. 加載Mongoose包
  3. 使用Mongoose.connect連接petpot MongoDB

server.js中添加頁面的內(nèi)容:

// Load required packages
var express = require('express');
var mongoose = require('mongoose');

// Connect to the beerlocker MongoDB
mongoose.connect('mongodb://localhost:27017/beerlocker');

創(chuàng)建第一個模型-PET

models文件夾中創(chuàng)建pet.js政敢。
打開pet.js增加下面的內(nèi)容:

// 引入mongoose庫
var mongoose = require('mongoose');

var Schema = mongoose.Schema;

// 定義pet模式
var petSchema = new Schema({
    name: { type: String, required: true },
    type: { type: String, required: true },
    userId: { type: String, required: true },
    quantity: Number
});

// 導出pet模型
module.exports = mongoose.model('pet', petSchema);
  1. 首先,我們引入mongoose包
  2. 創(chuàng)建一個映射到MongoDB集合的Mongoose模式胚迫,并定義該集合中文檔的格式
  3. 模式中包括3個字符串和1個數(shù)字喷户,其中3個字符串為必填項
  4. 導出mongoose pet模型用于接下來的應用中

創(chuàng)建第一個控制器-PET

controller文件夾中創(chuàng)建pet.js
打開controller/pet.js,首先引入剛才我們創(chuàng)建的pet模型

var Pet = require('../models/pet');

現(xiàn)在為我們的寵物園添加寵物

接著在controller/pet.js中添加頁面的內(nèi)容:

var Pet = require('../models/pet');
var postPets = function(req, res) {
    // 創(chuàng)建Pet模型的一個實例
    var pet = new Pet();
    // 使用Post數(shù)據(jù)設置這個實例的屬性
    pet.name = req.body.name;
    pet.type = req.body.type;
    pet.quantity = req.body.quantity;
    pet.userId = req.body.userId;

    // 保存實例并檢查錯誤
    pet.save(function(err) {
        if (err) {
            res.json({ message: 'error', data: err });
            return;
        }
        res.json({ message: 'done', data: pet });
    });
};
// 導出方法
module.exports = {
    postPets: postPets
}
  1. 首先引入pet模型
  2. 創(chuàng)建一個函數(shù)postPets访锻,在函數(shù)中創(chuàng)建pet模型的實例褪尝,使用post的數(shù)據(jù)來設置這個實例的屬性并保存
  3. 導出函數(shù),方便接下來應用中使用

準備接收 POST或PUT的數(shù)據(jù)

安裝中間件body-parser用于接收 POST或PUT的數(shù)據(jù)

npm install body-parser --save

更新Server.js

增加body-parser中間頁

// Load required packages
var express = require('express');
var mongoose = require('mongoose');
var bodyParser = require('body-parser');
// Create our Express application
var app = express();

// Use the body-parser package in our application
app.use(bodyParser.urlencoded({
  extended: true
}));

導入控制器pet

var petController = require('./controller/pet');

增加一個前綴為pet的新路由期犬,為post請求創(chuàng)建接口

router.route('/pets').post(petController.postPets);

使用Postman測試

image.png

獲取所有寵物

打開controller/pet.js增加獲取所有寵物的接口

var getPets = function(req, res) {
    Pet.find(function(err, pets) {
        if (err) {
            res.json({ message: 'error', data: err });
            return;
        }
        res.json({ message: 'done', data: pets });
    });
};

通過指定ID獲取寵物

var getPet = function(req, res) {
    Pet.findById({ _id: req.params.pet_id }, function(err, pet) {
        if (err) {
            res.json({ message: 'error', data: err });
            return;
        }
        res.json({ message: 'done', data: pet });
    });
};

更新寵物信息

var updatePet = function(req, res) {
    Pet.update({ _id: req.params.pet_id }, { quantity: req.body.quantity }, function(err, num) {
        if (err) {
            res.json({ message: 'error', data: err });
        }
        res.json({ message: ' update' })
    })
};

刪除寵物信息

var deletePet = function(req, res) {
    Pet.remove({ _id: req.params.pet_id }, function(err) {
        if (err) {
            res.json({ message: 'error', data: err });
        }
        res.json({ message: 'pet remove!' })
    });
};

導出函數(shù)

module.exports = {
    postPets: postPets,
    getPets: getPets,
    getPet: getPet,
    updatePet: updatePet,
    deletePet: deletePet
}

更新server.js

server.js中更新路由:

router.route('/pets')
    .post(petController.postPets)
    .get(petController.getPets);

router.route('/pets/:pet_id')
    .get(petController.getPet)
    .put(petController.updatePet)
    .delete(petController.deletePet);

Postman測試

image.png

image.png

image.png

image.png

我們現(xiàn)在已經(jīng)對寵物園的寵物實施了全面的CRUD河哑,下一節(jié)我們將創(chuàng)建用戶賬戶,使用Passport進行身份驗證龟虎。
完整代碼請訪問github

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末璃谨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌佳吞,老刑警劉巖拱雏,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異底扳,居然都是意外死亡铸抑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門衷模,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鹊汛,“玉大人,你說我怎么就攤上這事阱冶〉蟊铮” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵木蹬,是天一觀的道長职祷。 經(jīng)常有香客問我,道長届囚,這世上最難降的妖魔是什么有梆? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮意系,結(jié)果婚禮上泥耀,老公的妹妹穿的比我還像新娘。我一直安慰自己蛔添,他們只是感情好痰催,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著迎瞧,像睡著了一般夸溶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凶硅,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天缝裁,我揣著相機與錄音,去河邊找鬼足绅。 笑死捷绑,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的氢妈。 我是一名探鬼主播粹污,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼首量!你這毒婦竟也來了壮吩?” 一聲冷哼從身側(cè)響起进苍,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸭叙,沒想到半個月后觉啊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡递雀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚀浆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缀程。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖市俊,靈堂內(nèi)的尸體忽然破棺而出杨凑,到底是詐尸還是另有隱情,我是刑警寧澤摆昧,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布撩满,位于F島的核電站,受9級特大地震影響绅你,放射性物質(zhì)發(fā)生泄漏伺帘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一忌锯、第九天 我趴在偏房一處隱蔽的房頂上張望伪嫁。 院中可真熱鬧,春花似錦偶垮、人聲如沸张咳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脚猾。三九已至,卻和暖如春砚哗,著一層夾襖步出監(jiān)牢的瞬間龙助,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工蛛芥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泌参,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓常空,卻偏偏與公主長得像沽一,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子漓糙,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

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