- Koa.js 教程
- Koa.js - 首页
- Koa.js - 概述
- Koa.js - 环境配置
- Koa.js - Hello World
- Koa.js - 生成器
- Koa.js - 路由
- Koa.js - URL构建
- Koa.js - HTTP方法
- Koa.js - 请求对象
- Koa.js - 响应对象
- Koa.js - 重定向
- Koa.js - 错误处理
- Koa.js - 级联
- Koa.js - 模板引擎
- Koa.js - 表单数据
- Koa.js - 文件上传
- Koa.js - 静态文件
- Koa.js - Cookie
- Koa.js - Session
- Koa.js - 身份验证
- Koa.js - 压缩
- Koa.js - 缓存
- Koa.js - 数据库
- Koa.js - RESTful APIs
- Koa.js - 日志记录
- Koa.js - 脚手架
- Koa.js - 资源
- Koa.js 有用资源
- Koa.js - 快速指南
- Koa.js - 有用资源
- Koa.js - 讨论
Koa.js - 数据库
我们正在接收请求,但没有将其存储在任何地方。我们需要一个数据库来存储数据。我们将使用一个名为MongoDB的著名NoSQL数据库。要安装并了解Mongo,请访问此链接。
为了在Koa中使用Mongo,我们需要一个Node的客户端API。我们有多种选择,但是在这个教程中,我们将坚持使用mongoose。Mongoose用于在Node中为MongoDB进行文档建模。文档建模意味着我们将创建一个模型(很像面向文档编程中的类),然后我们将使用此模型生成文档(就像我们在OOP中创建类的文档一样)。我们所有的处理都将在这 些“文档”上进行,然后最终我们将这些文档写入我们的数据库。
设置Mongoose
现在我们已经安装了Mongo,让我们安装mongoose,就像我们安装其他Node包一样。
$ npm install --save mongoose
在我们开始使用mongoose之前,我们必须使用Mongo shell创建一个数据库。要创建一个新的数据库,请打开您的终端并输入“mongo”。一个Mongo shell将启动,输入以下内容。
use my_db
一个新的数据库将被创建。每当你打开Mongo shell时,它都会默认使用“test”数据库,你必须使用与上面相同的命令切换到你的数据库。
要使用mongoose,我们将在我们的app.js文件中引入它,然后连接到在mongodb://127.0.0.1上运行的mongod服务。
var koa = require('koa'); var _ = require('koa-router')(); var app = koa(); var mongoose = require('mongoose'); mongoose.connect('mongodb://127.0.0.1/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://127.0.0.1/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模型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://127.0.0.1/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'处定义一个post路由处理器来处理此请求。
var koa = require('koa'); var _ = require('koa-router')(); var app = koa(); var mongoose = require('mongoose'); mongoose.connect('mongodb://127.0.0.1/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中定义,并接受回调作为参数。此回调有两个参数,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提供了许多检索文档的函数,我们将重点介绍其中的三个。所有这些函数都将回调作为最后一个参数,并且与save函数一样,它们的参数是error和response。
这三个函数是:
Model.find(conditions, callback)
此函数查找与conditions对象中的字段匹配的所有文档。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(conditions, callback)
此函数始终获取单个最相关的文档。它与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://127.0.0.1/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://127.0.0.1/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://127.0.0.1:3000/people/507f1f77bcf86cd799439011
这将使用上述详细信息更新与路由中提供的id关联的文档。
删除文档
我们已经介绍了Create(创建)、Read(读取)和Update(更新),现在我们将了解如何使用mongoose删除文档。这里有三个函数,与更新完全一样。
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");
现在让我们创建一个路由来从我们的数据库中删除人员。
var koa = require('koa'); var _ = require('koa-router')(); var app = koa(); var mongoose = require('mongoose'); mongoose.connect('mongodb://127.0.0.1/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://127.0.0.1:3000/people/507f1f77bcf86cd799439011
这将删除具有给定id的人员,并生成以下消息:
{message: "Person with id 507f1f77bcf86cd799439011 removed."}
这就介绍了如何使用MongoDB、mongoose和Koa创建简单的CRUD应用程序。要进一步了解mongoose,请阅读API文档。