开发手册 欢迎您!
软件开发者资料库

Koa.js - 数据库

Koa.js数据库 - 从简单和简单的步骤学习Koa.js,从基本到高级概念,包括概述,环境,Hello World,生成器,路由,URL构建,HTTP方法,请求对象,响应对象,重定向,错误处理,级联,表单数据,文件上传,模板,静态文件,Cookie,会话,身份验证,压缩,缓存,数据库,RESTful API,日志记录,脚手架,资源。

我们正在接收请求,但不会将它们存储在任何地方.我们需要一个数据库来存储数据.我们将使用一个名为 MongoDB 的着名NoSQL数据库.要安装和阅读有关Mongo的信息.

为了使用使用Koa的Mongo,我们需要一个客户端API用于节点.我们有多种选择,但是对于本教程,我们将坚持 mongoose . Mongoose用于Node for MongoDB中的文档建模.文档建模意味着,我们将创建一个模型(很像在面向文档的编程中的),然后我们将生成文档这个模型(就像我们在OOP中创建类的文档).我们所有的处理都将在这些"文件"上完成,最后,我们将在我们的数据库中写下这些文件.

设置Mongoose

现在我们安装了Mongo,让我们安装mongoose,就像我们安装其他节点包一样.

$ npm install --save mongoose

在我们开始使用mongoose之前,我们必须使用Mongo shell创建一个数据库.要创建新数据库,请打开终端并输入"mongo". Mongo shell将启动,输入以下内容.

use my_db

将为您创建一个新数据库.每当你打开Mongo shell时,它都默认为"test"db,你必须使用与上面相同的命令更改到你的数据库.

要使用mongoose,我们将在我们的app.js文件中需要它,然后连接到在mongodb上运行的mongod服务://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);

现在我们的应用已连接到我们的数据库,让我们创建一个新模型.该模型将作为我们数据库中的集合.要创建新模型,请在定义任何路径之前使用以下代码.

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中添加新的获取路线以呈现此文档.

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中定义的,并接受回调作为参数.此回调有两个参数,错误响应.这将呈现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提供了很多检索文档的功能,我们将重点关注其中的三个.所有这些函数也将回调作为最后一个参数,就像save函数一样,它们的参数是错误和响应.

这三个函数是 :

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

我们还可以提供我们需要的预测,即我们需要的字段.例如,如果我们只想要国籍 "印度"的人的名称,我们使用 :

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提供三种更新文件的功能.

Model.update(condition, updates, callback)

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

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

让我们创建一条更新人的路线.这将是一个PUT路由,其中id为参数,有效载荷中包含详细信息.

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来删除文档.这里有三个函数,就像更新一样.

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

此函数将条件对象作为输入并删除符合条件的所有文档.例如,如果我们需要移除所有20岁的人,

  Person.remove({age:20});

Model.findOneAndRemove(condition, [callback])

此函数删除,最相关的文件根据条件对象.例如,

Person.remove({age:20});

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文档.