Koa.js - Cơ sở dữ liệu

Chúng tôi đang nhận được các yêu cầu, nhưng không lưu trữ chúng ở bất kỳ đâu. Chúng tôi cần một Cơ sở dữ liệu để lưu trữ dữ liệu. Chúng tôi sẽ sử dụng cơ sở dữ liệu NoSQL nổi tiếng có tênMongoDB. Để cài đặt và đọc về Mongo, hãy truy cập liên kết này.

Để sử dụng Mongo với Koa, chúng ta cần có API ứng dụng khách cho nút. Có nhiều lựa chọn cho chúng tôi, tuy nhiên đối với hướng dẫn này, chúng tôi sẽ bám vào mongoose . Mongoose được sử dụng chodocument modelingtrong Node cho MongoDB. Lập mô hình tài liệu có nghĩa là, chúng tôi sẽ tạoModel (giống như một class trong lập trình hướng tài liệu), và sau đó chúng tôi sẽ sản xuất documents sử dụng Mô hình này (giống như chúng tôi tạo documents of a classtrong OOP). Tất cả quá trình xử lý của chúng tôi sẽ được thực hiện trên các "tài liệu" này, sau đó cuối cùng, chúng tôi sẽ ghi các tài liệu này vào cơ sở dữ liệu của mình.

Thiết lập Mongoose

Bây giờ chúng ta đã cài đặt Mongo, chúng ta hãy cài đặt mongoose, giống như cách chúng ta đã cài đặt các gói nút khác của mình.

$ npm install --save mongoose

Trước khi bắt đầu sử dụng mongoose, chúng ta phải tạo cơ sở dữ liệu bằng cách sử dụng Mongo shell. Để tạo cơ sở dữ liệu mới, hãy mở thiết bị đầu cuối của bạn và nhập "mongo". Một trình bao Mongo sẽ bắt đầu, hãy nhập như sau.

use my_db

Một cơ sở dữ liệu mới sẽ được tạo cho bạn. Bất cứ khi nào bạn mở Mongo shell, nó sẽ mặc định là "test" db và bạn sẽ phải thay đổi cơ sở dữ liệu của mình bằng cách sử dụng lệnh tương tự như trên.

Để sử dụng mongoose, chúng tôi sẽ yêu cầu nó trong tệp app.js của chúng tôi và sau đó kết nối với dịch vụ mongod đang chạy trên mongodb: // localhost

var koa = require('koa');
var _ = require('koa-router')();
var app = koa();

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/my_db');

app.use(_.routes());
app.listen(3000);

Bây giờ ứng dụng của chúng tôi được kết nối với cơ sở dữ liệu của chúng tôi, hãy tạo một Mô hình mới. Mô hình này sẽ hoạt động như một tập hợp trong cơ sở dữ liệu của chúng tôi. Để tạo một Mô hình mới, hãy sử dụng mã sau, trước khi xác định bất kỳ tuyến nào.

var koa = require('koa');
var _ = require('koa-router')();
var app = koa();

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/my_db');

var personSchema = mongoose.Schema({
   name: String,
   age: Number,
   nationality: String
});

var Person = mongoose.model("Person", personSchema);

app.use(_.routes());
app.listen(3000);

Đoạn mã trên xác định lược đồ cho một người và được sử dụng để tạo Mô hình mongoose Person.

Lưu tài liệu

Bây giờ chúng ta sẽ tạo một biểu mẫu html mới, sẽ lấy thông tin chi tiết của một người và lưu nó vào cơ sở dữ liệu của chúng ta. Để tạo biểu mẫu, hãy tạo một tệp dạng xem mới có tên là person.pug trong thư mục dạng xem với nội dung sau.

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

Đồng thời thêm một tuyến nhận mới trong index.js để hiển thị tài liệu này.

var koa = require('koa');
var _ = require('koa-router')();
var app = koa();

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/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);

Vào localhost: 3000 / người để kiểm tra xem biểu mẫu của chúng tôi có hiển thị đúng không. Lưu ý rằng đây chỉ là giao diện người dùng, nó chưa hoạt động. Đây là cách biểu mẫu của chúng tôi trông.

Bây giờ chúng ta sẽ xác định một trình xử lý tuyến đường tại '/ person' sẽ xử lý yêu cầu này.

var koa = require('koa');
var _ = require('koa-router')();
var app = koa();

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/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);

Trong đoạn mã trên, nếu chúng tôi nhận được bất kỳ trường trống nào hoặc không nhận được bất kỳ trường nào, chúng tôi sẽ gửi phản hồi lỗi. Tuy nhiên, nếu chúng tôi nhận được một tài liệu được định dạng tốt, thì chúng tôi tạo một tài liệu NewPerson từ mô hình Person và lưu nó vào DB của chúng tôi bằng cách sử dụngnewPerson.save()chức năng. Điều này được định nghĩa trong mongoose và chấp nhận một cuộc gọi lại làm đối số. Lệnh gọi lại này có hai đối số,errorresponse. Điều này sẽ hiển thị chế độ xem show_message, vì vậy chúng tôi cũng cần tạo nó.

Để hiển thị phản hồi từ tuyến đường này, chúng tôi cũng sẽ cần tạo show_messagelượt xem. Tạo chế độ xem mới với mã sau.

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!

Sau đây là phản hồi mà chúng tôi nhận được khi gửi biểu mẫu thành công (show_message.pug).

Bây giờ chúng tôi có một giao diện để tạo người!

Lấy tài liệu

Mongoose cung cấp rất nhiều chức năng để lấy tài liệu, chúng tôi sẽ tập trung vào ba trong số đó. Tất cả các hàm này cũng nhận một cuộc gọi lại làm tham số cuối cùng và cũng giống như hàm lưu, các đối số của chúng là lỗi và phản hồi.

Ba chức năng là -

Model.find (điều kiện, gọi lại)

Hàm này tìm tất cả các tài liệu khớp với các trường trong đối tượng điều kiện. Các toán tử tương tự được sử dụng trong Mongo cũng hoạt động trong mongoose. Ví dụ, điều này sẽ lấy tất cả các tài liệu từ bộ sưu tập của những người.

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

Thao tác này sẽ tìm nạp tất cả các tài liệu có tên trường là "Ayush" và tuổi là 20.

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

Chúng tôi cũng có thể cung cấp phép chiếu mà chúng tôi cần, tức là, các trường chúng tôi cần. Ví dụ, nếu chúng ta chỉ muốnnames của những người có nationality"tiếng Ấn Độ" , chúng tôi sử dụng -

Person.find({nationality: "Indian"}, 
   "name", function(err, response) {
      console.log(response);
   });

Model.findOne (điều kiện, gọi lại)

Hàm này luôn tìm nạp một tài liệu duy nhất, phù hợp nhất. Nó có các đối số chính xác giống như Model.find ().

Model.findById (id, callback)

Chức năng này có trong _id(được định nghĩa bởi mongo) làm đối số đầu tiên, một chuỗi chiếu tùy chọn và một lệnh gọi lại để xử lý phản hồi. Ví dụ,

Person.findById("507f1f77bcf86cd799439011", 
   function(err, response){
      console.log(response);
   });

Hãy tạo một tuyến đường để xem tất cả hồ sơ của mọi người.

var koa = require('koa');
var _ = require('koa-router')();
var app = koa();

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/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);

Cập nhật tài liệu

Mongoose cung cấp ba chức năng để cập nhật tài liệu.

Model.update (tình trạng, cập nhật, gọi lại)

Hàm này nhận một điều kiện và cập nhật đối tượng làm đầu vào và áp dụng các thay đổi cho tất cả các tài liệu phù hợp với các điều kiện trong bộ sưu tập. Ví dụ, đoạn mã sau sẽ cập nhật tất cả tài liệu Cá nhân để có quốc tịch "Mỹ".

Person.update({age: 25},
   {nationality: "American"}, 
   function(err, response){
      console.log(response);
   });

Model.findOneAndUpdate (tình trạng, cập nhật, gọi lại)

Nó làm chính xác những gì được nói. Tìm một tài liệu dựa trên truy vấn và cập nhật tài liệu đó theo đối số thứ hai. Nó cũng lấy một cuộc gọi lại làm đối số cuối cùng. Ví dụ,

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

Model.findByIdAndUpdate (id, cập nhật, gọi lại)

Hàm này cập nhật một tài liệu duy nhất được xác định bằng id của nó. Ví dụ,

Person.findByIdAndUpdate("507f1f77bcf86cd799439011", 
   {name: "James"}, 
   function(err, response){
      console.log(response);
   });

Hãy tạo một lộ trình để cập nhật mọi người. Đây sẽ là một tuyến PUT với id là một tham số và các chi tiết trong tải trọng.

var koa = require('koa');
var _ = require('koa-router')();
var app = koa();
var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/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);

Để kiểm tra tuyến đường này, hãy nhập thông tin sau vào thiết bị đầu cuối của bạn (thay id bằng id từ những người đã tạo của bạn).

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

Thao tác này sẽ cập nhật tài liệu được liên kết với id được cung cấp trong lộ trình với các chi tiết ở trên.

Xóa tài liệu

Chúng tôi đã bảo hiểm Create, Read và Update, bây giờ chúng ta sẽ xem cách mongoose có thể được sử dụng để Xóa tài liệu. Có ba chức năng ở đây, giống hệt như cập nhật.

Model.remove (điều kiện, [gọi lại])

Hàm này nhận một đối tượng điều kiện làm đầu vào và loại bỏ tất cả các tài liệu phù hợp với các điều kiện. Ví dụ: nếu chúng tôi cần xóa tất cả những người ở độ tuổi 20,

Person.remove({age:20});

Model.findOneAndRemove (điều kiện, [gọi lại])

Chức năng này loại bỏ một single, tài liệu có liên quan nhất theo đối tượng điều kiện. Ví dụ,

Person.findOneAndRemove({name: "Ayush"});

Model.findByIdAndRemove (id, [gọi lại])

Hàm này loại bỏ một tài liệu duy nhất được xác định bởi id của nó. Ví dụ,

Person.findByIdAndRemove("507f1f77bcf86cd799439011");

Bây giờ, hãy tạo một lộ trình để xóa mọi người khỏi cơ sở dữ liệu của chúng ta.

var koa = require('koa');
var _ = require('koa-router')();
var app = koa();

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/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);

Để kiểm tra điều này, hãy sử dụng lệnh curl sau:

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

Thao tác này sẽ xóa người có id đã cho tạo ra thông báo sau. -

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

Phần này tóm tắt cách chúng ta có thể tạo các ứng dụng CRUD đơn giản bằng MongoDB, mongoose và Koa. Để khám phá thêm mongoose, hãy đọc tài liệu API.