ExpressJS - 資料庫



我們不斷收到請求,但最終沒有將它們儲存在任何地方。我們需要一個數據庫來儲存資料。為此,我們將使用名為MongoDB的 NoSQL 資料庫。

要安裝並瞭解有關 Mongo 的資訊,請訪問此連結

為了將 Mongo 與 Express 一起使用,我們需要 Node 的客戶端 API。我們有多種選擇,但對於本教程,我們將堅持使用mongoose。Mongoose 用於 MongoDB 的 Node 中的文件建模。對於文件建模,我們建立一個模型(類似於面向文件程式設計中的),然後我們使用此模型生成文件(就像我們在 OOP 中建立類的文件一樣)。我們所有的處理都將在這 些“文件”上進行,然後最終,我們將這些文件寫入我們的資料庫。

設定 Mongoose

現在您已安裝 Mongo,讓我們安裝 Mongoose,就像我們安裝其他 Node 包一樣:

npm install --save mongoose

在開始使用 mongoose 之前,我們必須使用 Mongo shell 建立一個數據庫。要建立新的資料庫,請開啟終端並輸入“mongo”。Mongo shell 將啟動,輸入以下程式碼:

use my_db

將為您建立一個新的資料庫。每當您開啟 mongo shell 時,它都會預設為“test”資料庫,您必須使用與上述相同的命令切換到您的資料庫。

要使用 Mongoose,我們將在index.js檔案中需要它,然後連線到在mongodb://上執行的mongodb服務。

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

以上程式碼定義了人的模式,並用於建立 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 路由以呈現此文件:

app.get('/person', function(req, res){
   res.render('person');
});

轉到“localhost:3000/person”以檢查表單是否顯示正確的輸出。請注意,這只是一個 UI,它尚不可用。以下螢幕截圖顯示了表單的顯示方式:

Mongoose Create

現在我們將定義一個在'/person'處的 post 路由處理程式,它將處理此請求

app.post('/person', function(req, res){
   var personInfo = req.body; //Get the parsed information
   
   if(!personInfo.name || !personInfo.age || !personInfo.nationality){
      res.render('show_message', {
         message: "Sorry, you provided worng info", type: "error"});
   } else {
      var newPerson = new Person({
         name: personInfo.name,
         age: personInfo.age,
         nationality: personInfo.nationality
      });
		
      newPerson.save(function(err, Person){
         if(err)
            res.render('show_message', {message: "Database error", type: "error"});
         else
            res.render('show_message', {
               message: "New person added", type: "success", person: personInfo});
      });
   }
});

在上面的程式碼中,如果我們收到任何空欄位或未收到任何欄位,我們將傳送錯誤響應。但是,如果我們收到格式良好的文件,那麼我們從 Person 模型建立一個newPerson文件,並使用newPerson.save()函式將其儲存到我們的資料庫中。這在 Mongoose 中定義,並接受回撥作為引數。此回撥有兩個引數 - 錯誤和響應。這些引數將呈現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 提供了許多檢索文件的功能,我們將重點介紹其中的 3 個。所有這些函式也以回撥作為最後一個引數,就像儲存函式一樣,它們的 аргументы是錯誤和響應。這三個函式如下:

Model.find(conditions, callback)

此函式查詢與 conditions 物件中的欄位匹配的所有文件。Mongo 中使用的相同運算子也適用於 mongoose。例如,

Person.find(function(err, response){
   console.log(response);
});

這將從人員集合中獲取所有文件。

Person.find({name: "Ayush", age: 20}, 
   function(err, response){
      console.log(response);
});

這將獲取名稱欄位為“Ayush”且年齡為 20 的所有文件。

我們還可以提供所需的投影,即我們需要的欄位。例如,如果我們只需要國籍為“印度”的人的姓名,則使用:

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 express = require('express');
var app = express();

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.get('/people', function(req, res){
   Person.find(function(err, response){
      res.json(response);
   });
});

app.listen(3000);

更新文件

Mongoose 提供 3 個更新文件的功能。這些函式如下所述:

Model.update(condition, updates, callback)

此函式以條件和更新物件作為輸入,並將更改應用於集合中與條件匹配的所有文件。例如,以下程式碼將更新所有 Person 文件中的國籍“美國”:

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

現在讓我們建立一個路由來更新人員。這將是一個帶有 id 作為引數且有效負載中包含詳細資訊的PUT路由。

var express = require('express');
var app = express();

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.put('/people/:id', function(req, res){
   Person.findByIdAndUpdate(req.params.id, req.body, function(err, response){
      if(err) res.json({message: "Error in updating person with id " + req.params.id});
      res.json(response);
   });
});

app.listen(3000);

要測試此路由,請在您的終端中輸入以下內容(將 id 替換為您建立的人員中的 id):

curl -X PUT --data "name = James&age = 20&nationality = American
"https://:3000/people/507f1f77bcf86cd799439011

這將使用上述詳細資訊更新與路由中提供的 id 關聯的文件。

刪除文件

我們已經涵蓋了建立、讀取更新,現在我們將瞭解如何使用 Mongoose 來刪除文件。我們這裡有 3 個函式,與更新完全一樣。

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 express = require('express');
var app = express();

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.delete('/people/:id', function(req, res){
   Person.findByIdAndRemove(req.params.id, function(err, response){
      if(err) res.json({message: "Error in deleting record id " + req.params.id});
      else res.json({message: "Person with id " + req.params.id + " removed."});
   });
});

app.listen(3000);

要檢查輸出,請使用以下 curl 命令:

curl -X DELETE https://:3000/people/507f1f77bcf86cd799439011

這將刪除給定 id 的人員,併產生以下訊息:

{message: "Person with id 507f1f77bcf86cd799439011 removed."}

這總結了我們如何使用 MongoDB、Mongoose 和 Express 建立簡單的 CRUD 應用程式。要進一步瞭解 Mongoose,請閱讀API 文件

廣告

© . All rights reserved.