Koajs-database

提供:Dev Guides
移動先:案内検索

Koa.js-データベース

リクエストを受信して​​いますが、どこにも保存していません。 データを保存するデータベースが必要です。 MongoDB と呼ばれる有名なNoSQLデータベースを使用します。 Mongoをインストールして読むには、link:/mongodb/mongodb_environment [this link。]にアクセスしてください。

KoaでMongoを使用するには、ノードのクライアントAPIが必要です。 複数のオプションがありますが、このチュートリアルではhttp://mongoosejs.com/[mongoose]に固執します。 Mongooseは、Node for MongoDBの*ドキュメントモデリング*に使用されます。 ドキュメントモデリングとは、 Model (ドキュメント指向プログラミングの class とほぼ同じ)を作成し、このモデルを使用して documents を生成することです(OOPで classs of document を作成するように) 。 すべての処理はこれらの「ドキュメント」で行われ、最後にこれらのドキュメントをデータベースに書き込みます。

Mongooseのセットアップ

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

上記のコードは、人のスキーマを定義し、mongoose Model 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://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であり、まだ機能していないことに注意してください。 これがフォームの外観です。

Mongoose Create

ここで、このリクエストを処理するポストルートハンドラーを '/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ドキュメントを作成し、* newPerson.save()関数を使用してDBに保存します。 これはmongooseで定義され、引数としてコールバックを受け入れます。 このコールバックには、 *error および response の2つの引数があります。 これにより、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つに焦点を当てます。 これらの関数はすべて、最後のパラメーターとしてコールバックを使用し、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);
   });

必要な投影、つまり必要なフィールドも提供できます。 たとえば、*国籍*が_ "Indian" _である人々の*名前*のみが必要な場合、次を使用します-

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

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

この関数は、常に最も関連性の高い単一のドキュメントを取得します。 Model.find()とまったく同じ引数を持ちます。

Model.findById(id、コールバック)

この関数は、最初の引数として _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、更新、コールバック)

この関数は、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に関連付けられたドキュメントが上記の詳細で更新されます。

ドキュメントを削除する

  • C * reate、* R * ead、* U *pdateについて説明しましたが、今度はmongooseを使用してドキュメントを削除する方法を確認します。 ここには、更新とまったく同じ3つの関数があります。

Model.remove(条件、[コールバック])

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

Person.remove({age:20});

Model.findOneAndRemove(条件、[コールバック])

この関数は、条件オブジェクトに応じて、最も関連性の高いドキュメントを削除します。 例えば、

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://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アプリケーションを作成する方法をまとめました。 mongooseをさらに詳しく調べるには、http://mongoosejs.com [APIドキュメント]をお読みください。