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,它還不工作。這就是我們的表單外觀。

Mongoose Create

我們現在將在'/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中定義,並接受回撥作為引數。此回撥有兩個引數,errorresponse。這將渲染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 Response

我們現在有了建立人員的介面!

檢索文件

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文件。

廣告