教程 > koa.js 中文教程 > 阅读:90

koa.js 数据库——迹忆客-ag捕鱼王app官网

我们正在接收请求,但没有将它们存储在任何地方。 我们需要一个数据库来存储数据。 我们将使用一个名为 mongodb 的著名 nosql 数据库。

为了在 koa 中使用 mongo,我们需要一个用于 node 的客户端 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://localhost 上的 mongod 服务

var koa = require('koa');
var _ = require('koa-router')();
var app = new 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 = new 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 的模式,并用于创建一个 mongoose 模型 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 = new 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);

我们现在将在 '/person' 处定义一个 post 路由处理程序来处理这个请求。

var koa = require('koa');
var _ = require('koa-router')();
var app = new 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(ctx,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 中定义的,并接受回调作为参数。 这个回调有两个参数,错误和响应。 这将呈现 show_message 视图,因此我们也需要创建它。

要显示来自该路由的响应,我们还需要创建一个 show_message.pug 视图。 使用以下代码创建一个新视图。

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!

检索文档

mongoose 提供了很多用于检索文档的功能,我们将重点介绍其中的三个。 所有这些函数也都将回调作为最后一个参数,就像保存函数一样,它们的参数是错误和响应。

这三个功能是

model.find(conditions, callback)

此函数查找与条件对象中的字段匹配的所有文档。 mongo 中使用的相同运算符也适用于 mongoose。 例如,这将从 person 的集合中获取所有文档。

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(conditions, callback)

此函数始终获取单个、最相关的文档。 它与 model.find() 具有相同的参数。

model.findbyid(id, callback)

该函数将 _id(由 mongo 定义)作为第一个参数,一个可选的 projection 字符串和一个回调来处理响应。 例如,

person.findbyid("507f1f77bcf86cd799439011", 
   function(err, response){
      console.log(response);
   });

让我们创建一条路由来查看所有人员记录。

var koa = require('koa');
var _ = require('koa-router')();
var app = new 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 文档,使其具有“中国”国籍。

person.update({age: 25},
   {nationality: "china"}, 
   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);
   });

让我们创建一条更新 person 的路由。 这将是一个 put 路由,其中 id 作为参数和有效负载中的详细信息。

var koa = require('koa');
var _ = require('koa-router')();
var app = new 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 = china" https://localhost:3000/people/507f1f77bcf86cd799439011

这将使用上述详细信息更新与路由中提供的 id 关联的文档。


删除文档

我们已经介绍了创建、读取和更新,现在我们将了解如何使用 mongoose 来删除文档。 这里一共有三个函数,跟update一模一样。

model.remove(condition, [callback])

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

person.remove({age:20});

model.findoneandremove(condition, [callback])

此函数根据条件对象删除单个、最相关的文档。 例如,

person.findoneandremove({name: "ayush"});

model.findbyidandremove(id, [callback])

此函数删除由其 id 标识的单个文档。 例如,

person.findbyidandremove("507f1f77bcf86cd799439011");

现在让我们创建一条从数据库中删除 person 的路由。

var koa = require('koa');
var _ = require('koa-router')();
var app = new 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的知识,请阅读 。

查看笔记

扫码一下
查看教程更方便
网站地图