📜  Koa.js-数据库

📅  最后修改于: 2020-10-23 07:53:11             🧑  作者: Mango


我们正在接收请求,但没有将它们存储在任何地方。我们需要一个数据库来存储数据。我们将使用一个著名的NoSQL数据库MongoDB 。要安装和阅读有关Mongo的信息,请转到此链接。

为了将Mongo与Koa结合使用,我们需要该节点的客户端API。我们有多种选择,但是在本教程中,我们将坚持使用mongoose 。 Mongoose用于Node for MongoDB中的文档建模。文档建模意味着,我们将创建一个Model (非常类似于面向文档编程中的),然后将使用此Model生成文档(就像我们在OOP中创建类的文档一样)。我们所有的处理都将在这些“文档”上完成,然后,最后,我们将这些文档写入数据库中。

设置猫鼬

现在我们已经安装了Mongo,让我们以安装其他节点软件包的相同方式安装mongoose。

$ npm install --save mongoose

在开始使用猫鼬之前,我们必须使用Mongo Shell创建数据库。要创建一个新的数据库,请打开您的终端并输入“ mongo”。一个Mongo shell将启动,输入以下内容。

use my_db

将为您创建一个新的数据库。每当您打开Mongo Shell时,它将默认为“测试”数据库,并且您必须使用与上述相同的命令更改为数据库。

要使用猫鼬,我们将在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);

上面的代码为人定义了架构,并用于创建猫鼬模型

保存文件

现在,我们将创建一个新的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检查我们的表单是否显示正确。请注意,这只是用户界面,尚无法使用。这就是我们表格的外观。

猫鼬创建

现在,我们将在“ / 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()函数将其保存到数据库中。这在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)收到的回复。

猫鼬反应

现在,我们有了创建人员的界面!

检索文件

猫鼬提供了许多检索文档的功能,我们将重点介绍其中的三个。所有这些函数还将回调作为最后一个参数,就像save函数,它们的参数是错误和响应。

这三个功能是-

Model.find(条件,回调)

此函数查找与conditions对象中的字段匹配的所有文档。 Mongo中使用的相同运算符也可以在猫鼬中工作。例如,这将从个人收藏中获取所有文档。

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

这将获取字段名称为“ Ayush”且年龄为20的所有文档。

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

我们还可以提供所需的投影,即所需的字段。例如,如果我们只想要国籍“印度”的人的姓名,则使用-

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

更新文件

猫鼬提供了三种更新文档的功能。

Model.update(条件,更新,回调)

此函数接受一个条件并以更新对象为输入,并将更改应用于与集合中的条件匹配的所有文档。例如,以下代码将所有“个人”文档更新为“美国”国籍。

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

Model.findOneAndUpdate(条件,更新,回调)

它完全按照说的做。根据查询查找一个文档,并根据第二个参数对其进行更新。它还将回调作为最后一个参数。例如,

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相关联的文档。

删除文件

我们已经覆盖çreate,R EAD和U PDATE,现在我们将看到猫鼬如何使用删除文件。这里有三个功能,就像更新一样。

Model.remove(条件,[回调])

此函数将条件对象作为输入,并删除所有与条件匹配的文档。例如,如果我们需要删除所有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://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文档。