Koa.js-データベース

リクエストを受け取っていますが、どこにも保存していません。データを保存するためのデータベースが必要です。と呼ばれる有名なNoSQLデータベースを使用しますMongoDB。Mongoをインストールして読むには、このリンクにアクセスしてください。

KoaでMongoを使用するには、ノードのクライアントAPIが必要です。私たちには複数のオプションがありますが、このチュートリアルではマングースに固執します。マングースはdocument modelingMongoDBのノードで。ドキュメントモデリングとは、Model (のように class ドキュメント指向プログラミングで)、そして私たちは生産します documents このモデルを使用して(私たちが作成するように) documents of a classOOPで)。すべての処理はこれらの「ドキュメント」に対して実行され、最後にこれらのドキュメントをデータベースに書き込みます。

マングースの設定

Mongoがインストールされたので、他のノードパッケージをインストールするのと同じ方法でmongooseをインストールしましょう。

$ npm install --save mongoose

mongooseの使用を開始する前に、Mongoシェルを使用してデータベースを作成する必要があります。新しいデータベースを作成するには、ターミナルを開いて「mongo」と入力します。Mongoシェルが起動します。次のように入力します。

use my_db

新しいデータベースが作成されます。Mongoシェルを開くと、デフォルトで「test」dbになり、上記と同じコマンドを使用してデータベースに変更する必要があります。

mongooseを使用するには、app.jsファイルでそれを要求してから、mongodb:// localhostで実行されているmongodサービスに接続します。

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

これでアプリがデータベースに接続されました。新しいモデルを作成しましょう。このモデルは、データベースのコレクションとして機能します。新しいモデルを作成するには、ルートを定義する前に、次のコードを使用します。

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

上記のコードは、人のスキーマを定義し、マングースモデルを作成するために使用されます 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 routeを追加して、このドキュメントをレンダリングします。

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

localhost:3000 / personに移動して、フォームが正しく表示されているかどうかを確認します。これは単なるUIであり、まだ機能していないことに注意してください。これが私たちのフォームの外観です。

次に、このリクエストを処理するポストルートハンドラーを「/ person」に定義します。

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

上記のコードでは、空のフィールドを受け取った場合、またはフィールドを受け取らなかった場合、エラー応答を送信します。ただし、整形式のドキュメントを受け取った場合は、PersonモデルからnewPersonドキュメントを作成し、を使用してDBに保存します。newPerson.save()関数。これはマングースで定義され、引数としてコールバックを受け入れます。このコールバックには2つの引数があります。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は、ドキュメントを取得するための多くの機能を提供します。そのうちの3つに焦点を当てます。これらの関数はすべて、最後のパラメーターとしてコールバックも受け取ります。save関数と同様に、引数はエラーと応答です。

3つの機能は次のとおりです。

Model.find(条件、コールバック)

この関数は、条件オブジェクトのフィールドに一致するすべてのドキュメントを検索します。Mongoで使用されているのと同じ演算子がmongooseでも機能します。たとえば、これにより、個人のコレクションからすべてのドキュメントがフェッチされます。

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

これにより、フィールド名が「Ayush」で年齢が20のすべてのドキュメントがフェッチされます。

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

また、必要な予測、つまり必要なフィールドを提供することもできます。たとえば、names その人々の nationality「インド」で、使用します-

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

Model.findOne(条件、コールバック)

この関数は、常に単一の最も関連性の高いドキュメントをフェッチします。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://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);

ドキュメントの更新

Mongooseは、ドキュメントを更新するための3つの機能を提供します。

Model.update(条件、更新、コールバック)

この関数は条件を受け取り、入力としてオブジェクトを更新し、コレクション内の条件に一致するすべてのドキュメントに変更を適用します。たとえば、次のコードは、国籍が「アメリカ人」になるようにすべての個人文書を更新します。

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

Model.findOneAndUpdate(条件、更新、コールバック)

それはまさに言われていることをします。クエリに基づいて1つのドキュメントを検索し、2番目の引数に従ってそれを更新します。また、最後の引数としてコールバックを取ります。例えば、

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

このルートをテストするには、ターミナルに次のように入力します(IDを作成したユーザーのIDに置き換えます)。

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

これにより、ルートで提供されたIDに関連付けられたドキュメントが上記の詳細で更新されます。

ドキュメントの削除

カバーしました Create、 Readと Update、マングースを使用してドキュメントを削除する方法を見ていきます。ここには、更新とまったく同じように3つの関数があります。

Model.remove(condition、[callback])

この関数は、条件オブジェクトを入力として受け取り、条件に一致するすべてのドキュメントを削除します。たとえば、20歳のすべての人を削除する必要がある場合

Person.remove({age:20});

Model.findOneAndRemove(condition、[callback])

この関数は、 single、条件オブジェクトに応じた最も関連性の高いドキュメント。例えば、

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

Model.findByIdAndRemove(id、[コールバック])

この関数は、IDで識別される単一のドキュメントを削除します。例えば、

Person.findByIdAndRemove("507f1f77bcf86cd799439011");

それでは、データベースから人を削除するルートを作成しましょう。

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

これをテストするには、次のcurlコマンドを使用します-

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

これにより、指定されたIDを持つ人が削除され、次のメッセージが生成されます。−

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

これで、MongoDB、mongoose、Koaを使用して簡単なCRUDアプリケーションを作成する方法をまとめました。マングースをさらに詳しく調べるには、APIドキュメントをお読みください。