KoaJS 数据库

  • 定义和使用

    我们正在接收请求,但没有将它们存储在任何地方。我们需要一个数据库来存储数据。我们将使用一个著名的 NoSQL 数据库 MongoDB。要安装并阅读 Mongo,请转到这个链接。
    为了在 Koa 中使用 Mongo,我们需要一个用于节点的客户端 API。我们有多种选择,但是在本教程中,我们将继续讨论 mongoose。Mongoose 用于 MongoDB 节点中的文档建模。文档建模意味着,我们将创建一个模型(很像面向文档编程中的类),然后使用这个模型生成文档(就像我们在 OOP 中创建类的文档一样)。我们所有的处理都将在这些 "documents" 上完成,然后,我们将这些文档写入我们的数据库。
    现在我们已经安装了 Mongo,让我们安装 mongoose,就像我们安装其他节点包一样。
    $ npm install --save mongoose
    
    在开始使用 mongoose 之前,我们必须使用 mongoshell 创建一个数据库。要创建一个新的数据库,打开终端并输入 “mongo”。一个 mongoshell 将启动,输入以下内容。
    use my_db
    
    将为您创建一个新的数据库。每当您打开 mongoshell 时,它将默认为 “test” db,并且您必须使用与上面相同的命令更改到您的数据库。
    要使用 mongoose,我们需要 app.js 文件,然后连接到运行在上的 mongod 服务 mongodb://localhost
    var koa = require('koa');
    var _router= require('koa-router')();
    var app = new koa();
    
    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/my_db');
    
    app.use(_router.routes());
    app.listen(3001);
    
    现在我们的应用程序已经连接到数据库,让我们创建一个新的模型。这个模型将作为我们数据库中的一个集合。要创建新模型,请在定义任何管线之前使用以下代码。
    var koa = require('koa');
    var _router= require('koa-router')();
    var app = new koa();
    
    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/my_db');
    
    app.use(_router.routes());
    app.listen(3001);
    
    现在我们的应用程序已经连接到数据库,让我们创建一个新的模型。这个模型将作为我们数据库中的一个集合。要创建新模型,请在定义任何管线之前使用以下代码。
    var koa = require('koa');
    var _router = 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(_router.routes());
    app.listen(3001);
    
    上面的代码定义了 person 的模式,并用于创建 mongoose 模型 person。
  • 保存文档

    现在我们将创建一个新的 html 表单,它将获取一个人的详细信息并将其保存到我们的数据库中。要创建窗体,请创建一个名为 person.pug 包含以下内容的 views 目录。
    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 _router= 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);
    
    _router.get('/person', async (ctx)=>{
        await ctx.render('person');
    });
    
    app.use(_router.routes());
    app.listen(3001);
    
    访问 localhost:3001/person 检查我们的表格是否显示正确。请注意,这只是用户界面,它还没有工作。这就是我们的外形。
    mogo
    我们现在将在 '/person' 定义一个 post route 处理程序,它将处理此请求。
    var koa = require('koa');
    var _router = 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);
    
    _router.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(_router.routes());
    app.listen(3001);
    
    在上面的代码中,如果我们收到任何空字段或没有收到任何字段,我们将发送一个错误响应。但是,如果我们收到一个格式良好的文档,那么我们将从 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).
    mogo
    我们现在有一个界面来创建 persons!
  • 检索文档

    Mongoose 提供了很多检索文档的功能,我们将重点介绍其中的三个。所有这些函数还将回调作为最后一个参数,就像 save 函数一样,它们的参数是 error 和 response。
    这三个功能是 -
    Model.find(conditions, callback)
    此函数用于查找与 conditions 对象中的字段匹配的所有文档。Mongo 中使用的相同运算符也适用于 mongoose。
    例如,这将从 persons 集合中获取所有文档。
    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 _router= 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);
    
    _router.get('/people', getPeople);
    function *getPeople(next){
        var self = this;
        yield Person.find(function(err, response){
            self.body = response;
        });
    }
    app.use(_router.routes());
    app.listen(3001);
    
  • 更新文档

    Mongoose 提供了三个更新文档的功能。
    Model.update(condition, updates, callback)
    此函数接受一个条件并更新对象作为输入,并将更改应用于与集合中条件匹配的所有文档。例如,以下代码将更新所有个人文档,使其具有 "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);
    });
    
    让我们创建一个更新人员的路线。这将是一个以 id 作为参数并在有效负载中显示详细信息的 PUT 路由。
    var koa = require('koa');
    var _router = 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);
    
    _router.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(_router.routes());
    app.listen(3001);
    
    要测试此路由,请在终端中输入以下内容(用您创建的人员的 id 替换 id)。
    curl -X PUT --data "name = James&age = 20&nationality = American" https://localhost:3001/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");
    
    现在让我们创建一个从数据库中删除人员的路径。
    var koa = require('koa');
    var _router = 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);
    
    _router.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(_router.routes());
    app.listen(3001);
    
    要测试这一点,请使用以下 curl 命令-
    curl -X DELETE https://localhost:3001/people/507f1f77bcf86cd799439011
    
    这将删除产生以下消息的具有给定 id 的人。
    {message: "Person with id 507f1f77bcf86cd799439011 removed."}
    
    本文总结了如何使用 MongoDB、mongoose 和 Koa 创建简单的 CRUD 应用程序。要进一步探索 mongoose,请阅读API文档