
- Koa.js 教程
- Koa.js - 首頁
- Koa.js - 概述
- Koa.js - 環境配置
- Koa.js - Hello World
- Koa.js - 生成器
- Koa.js - 路由
- Koa.js - URL構建
- Koa.js - HTTP方法
- Koa.js - 請求物件
- Koa.js - 響應物件
- Koa.js - 重定向
- Koa.js - 錯誤處理
- Koa.js - 級聯
- Koa.js - 模板引擎
- Koa.js - 表單資料
- Koa.js - 檔案上傳
- Koa.js - 靜態檔案
- Koa.js - Cookie
- Koa.js - Session
- Koa.js - 身份驗證
- Koa.js - 壓縮
- Koa.js - 快取
- Koa.js - 資料庫
- Koa.js - RESTful APIs
- Koa.js - 日誌記錄
- Koa.js - 腳手架
- Koa.js - 資源
- Koa.js 有用資源
- Koa.js - 快速指南
- Koa.js - 有用資源
- Koa.js - 討論
Koa.js - 資料庫
我們正在接收請求,但沒有將其儲存在任何地方。我們需要一個數據庫來儲存資料。我們將使用一個名為MongoDB的著名NoSQL資料庫。要安裝並瞭解Mongo,請訪問此連結。
為了在Koa中使用Mongo,我們需要一個Node的客戶端API。我們有多種選擇,但是在這個教程中,我們將堅持使用mongoose。Mongoose用於在Node中為MongoDB進行文件建模。文件建模意味著我們將建立一個模型(很像面向文件程式設計中的類),然後我們將使用此模型生成文件(就像我們在OOP中建立類的文件一樣)。我們所有的處理都將在這 些“文件”上進行,然後最終我們將這些文件寫入我們的資料庫。
設定Mongoose
現在我們已經安裝了Mongo,讓我們安裝mongoose,就像我們安裝其他Node包一樣。
$ npm install --save mongoose
在我們開始使用mongoose之前,我們必須使用Mongo shell建立一個數據庫。要建立一個新的資料庫,請開啟您的終端並輸入“mongo”。一個Mongo shell將啟動,輸入以下內容。
use my_db
一個新的資料庫將被建立。每當你開啟Mongo shell時,它都會預設使用“test”資料庫,你必須使用與上面相同的命令切換到你的資料庫。
要使用mongoose,我們將在我們的app.js檔案中引入它,然後連線到在mongodb://上執行的mongod服務。
var koa = require('koa'); var _ = require('koa-router')(); var app = koa(); var mongoose = require('mongoose'); mongoose.connect('mongodb:///my_db'); app.use(_.routes()); app.listen(3000);
現在我們的應用程式已連線到我們的資料庫,讓我們建立一個新的模型。此模型將在我們的資料庫中充當集合。要建立一個新的模型,請在定義任何路由之前使用以下程式碼。
var koa = require('koa'); var _ = require('koa-router')(); var app = koa(); var mongoose = require('mongoose'); mongoose.connect('mongodb:///my_db'); var personSchema = mongoose.Schema({ name: String, age: Number, nationality: String }); var Person = mongoose.model("Person", personSchema); app.use(_.routes()); app.listen(3000);
以上程式碼定義了一個人的模式,並用於建立一個mongoose模型Person。
儲存文件
現在我們將建立一個新的HTML表單,它將獲取一個人的詳細資訊並將其儲存到我們的資料庫。要建立表單,請在views目錄中建立一個名為person.pug的新檢視檔案,內容如下。
html head title Person body form(action = "/person", method = "POST") div label(for = "name") Name: input(name = "name") br div label(for = "age") Age: input(name = "age") br div label(for = "nationality") Nationality: input(name = "nationality") br button(type = "submit") Create new person
還在index.js中新增一個新的get路由來渲染此文件。
var koa = require('koa'); var _ = require('koa-router')(); var app = koa(); var mongoose = require('mongoose'); mongoose.connect('mongodb:///my_db'); var personSchema = mongoose.Schema({ name: String, age: Number, nationality: String }); var Person = mongoose.model("Person", personSchema); _.get('/person', getPerson); function *getPerson(next){ this.render('person'); yield next; } app.use(_.routes()); app.listen(3000);
轉到localhost:3000/person以檢查我們的表單是否正確顯示。請注意,這只是UI,它還不工作。這就是我們的表單外觀。

我們現在將在'/person'處定義一個post路由處理器來處理此請求。
var koa = require('koa'); var _ = require('koa-router')(); var app = koa(); var mongoose = require('mongoose'); mongoose.connect('mongodb:///my_db'); var personSchema = mongoose.Schema({ name: String, age: Number, nationality: String }); var Person = mongoose.model("Person", personSchema); _.post('/person', createPerson); function *createPerson(next){ var self = this; var personInfo = self.request.body; //Get the parsed information if(!personInfo.name || !personInfo.age || !personInfo.nationality){ self.render( 'show_message', {message: "Sorry, you provided wrong info", type: "error"}); } else { var newPerson = new Person({ name: personInfo.name, age: personInfo.age, nationality: personInfo.nationality }); yield newPerson.save(function(err, res) { if(err) self.render('show_message', {message: "Database error", type: "error"}); else self.render('show_message', {message: "New person added", type: "success", person: personInfo}); }); } } app.use(_.routes()); app.listen(3000);
在上面的程式碼中,如果我們收到任何空欄位或沒有收到任何欄位,我們將傳送錯誤響應。但是,如果我們收到格式良好的文件,那麼我們將從Person模型建立一個newPerson文件,並使用newPerson.save()函式將其儲存到我們的資料庫。這在mongoose中定義,並接受回撥作為引數。此回撥有兩個引數,error和response。這將渲染show_message檢視,因此我們也需要建立它。
為了顯示此路由的響應,我們還需要建立一個show_message檢視。使用以下程式碼建立一個新的檢視。
html head title Person body if(type = "error") h3(style = "color:red") #{message} else h3 New person, name: #{person.name}, age: #{person.age} and nationality: #{person.nationality} added!
以下是成功提交表單後收到的響應(show_message.pug)。

我們現在有了建立人員的介面!
檢索文件
Mongoose提供了許多檢索文件的函式,我們將重點介紹其中的三個。所有這些函式都將回調作為最後一個引數,並且與save函式一樣,它們的引數是error和response。
這三個函式是:
Model.find(conditions, callback)
此函式查詢與conditions物件中的欄位匹配的所有文件。Mongo中使用的相同運算子也適用於mongoose。例如,這將從人員集合中獲取所有文件。
Person.find(function(err, response){ console.log(response); });
這將獲取名稱欄位為“Ayush”且年齡為20的所有文件。
Person.find({name: "Ayush", age: 20}, function(err, response){ console.log(response); });
我們還可以提供所需的投影,即我們所需的欄位。例如,如果我們只需要姓名欄位為“Indian”的人的姓名,我們使用:
Person.find({nationality: "Indian"}, "name", function(err, response) { console.log(response); });
Model.findOne(conditions, callback)
此函式始終獲取單個最相關的文件。它與Model.find()具有完全相同的引數。
Model.findById(id, callback)
此函式將_id(由mongo定義)作為第一個引數,一個可選的投影字串和一個回撥來處理響應。例如,
Person.findById("507f1f77bcf86cd799439011", function(err, response){ console.log(response); });
讓我們建立一個路由來檢視所有人員記錄。
var koa = require('koa'); var _ = require('koa-router')(); var app = koa(); var mongoose = require('mongoose'); mongoose.connect('mongodb:///my_db'); var personSchema = mongoose.Schema({ name: String, age: Number, nationality: String }); var Person = mongoose.model("Person", personSchema); _.get('/people', getPeople); function *getPeople(next){ var self = this; yield Person.find(function(err, response){ self.body = response; }); } app.use(_.routes()); app.listen(3000);
更新文件
Mongoose提供了三個更新文件的函式。
Model.update(condition, updates, callback)
此函式將條件和更新物件作為輸入,並將更改應用於集合中與條件匹配的所有文件。例如,以下程式碼將更新所有Person文件,使其具有國籍“American”。
Person.update({age: 25}, {nationality: "American"}, function(err, response){ console.log(response); });
Model.findOneAndUpdate(condition, updates, callback)
它完全按照字面意思執行。根據查詢查詢一個文件,並根據第二個引數更新該文件。它還將回調作為最後一個引數。例如,
Person.findOneAndUpdate({name: "Ayush"}, {age: 40}, function(err, response){ console.log(response); });
Model.findByIdAndUpdate(id, updates, callback)
此函式更新由其id標識的單個文件。例如,
Person.findByIdAndUpdate("507f1f77bcf86cd799439011", {name: "James"}, function(err, response){ console.log(response); });
讓我們建立一個路由來更新人員資訊。這將是一個PUT路由,引數為id,有效負載為詳細資訊。
var koa = require('koa'); var _ = require('koa-router')(); var app = koa(); var mongoose = require('mongoose'); mongoose.connect('mongodb:///my_db'); var personSchema = mongoose.Schema({ name: String, age: Number, nationality: String }); var Person = mongoose.model("Person", personSchema); _.put('/people/:id', updatePerson); function *updatePerson() { var self = this; yield Person.findByIdAndUpdate(self.params.id, {$set: {self.request.body}}, function(err, response){ if(err) { self.body = { message: "Error in updating person with id " + self.params.id}; } else { self.body = response; } }); } app.use(_.routes()); app.listen(3000);
要測試此路由,請在您的終端中輸入以下內容(將id替換為您建立的人員的id)。
curl -X PUT --data "name = James&age = 20&nationality = American" https://:3000/people/507f1f77bcf86cd799439011
這將使用上述詳細資訊更新與路由中提供的id關聯的文件。
刪除文件
我們已經介紹了Create(建立)、Read(讀取)和Update(更新),現在我們將瞭解如何使用mongoose刪除文件。這裡有三個函式,與更新完全一樣。
Model.remove(condition, [callback])
此函式將條件物件作為輸入,並刪除與條件匹配的所有文件。例如,如果我們需要刪除所有年齡為20的人,
Person.remove({age:20});
Model.findOneAndRemove(condition, [callback])
此函式根據條件物件刪除單個最相關的文件。例如,
Person.findOneAndRemove({name: "Ayush"});
Model.findByIdAndRemove(id, [callback])
此函式刪除由其id標識的單個文件。例如,
Person.findByIdAndRemove("507f1f77bcf86cd799439011");
現在讓我們建立一個路由來從我們的資料庫中刪除人員。
var koa = require('koa'); var _ = require('koa-router')(); var app = koa(); var mongoose = require('mongoose'); mongoose.connect('mongodb:///my_db'); var personSchema = mongoose.Schema({ name: String, age: Number, nationality: String }); var Person = mongoose.model("Person", personSchema); _.delete('/people/:id', deletePerson); function *deletePerson(next){ var self = this; yield Person.findByIdAndRemove(self.params.id, function(err, response){ if(err) { self.body = {message: "Error in deleting record id " + self.params.id}; } else { self.body = {message: "Person with id " + self.params.id + " removed."}; } }); } app.use(_.routes()); app.listen(3000);
要測試此功能,請使用以下curl命令:
curl -X DELETE https://:3000/people/507f1f77bcf86cd799439011
這將刪除具有給定id的人員,並生成以下訊息:
{message: "Person with id 507f1f77bcf86cd799439011 removed."}
這就介紹瞭如何使用MongoDB、mongoose和Koa建立簡單的CRUD應用程式。要進一步瞭解mongoose,請閱讀API文件。