项目地址:https://github.com/caochangkui/demo/tree/koa2-learn

1 构建项目

1.1 安装koa-generator

$ npm install -g koa-generator

1.2 使用koa-generator生成koa2项目

$ koa2  -e project(项目名称)   (-e 代表使用模板引擎ejs)

1.3 进入项目

$ cd project
$ npm install

1.4 启动项目,默认端口号是3000

$  DEBUG=koa2-learn:* npm start        (该方法在修改文件时需要重新启动服务。不建议使用)
$ npm run dev (该方法可以直接刷新服务)

1.5 项目目录

其中:dbs为后来创建的操作mongo的文件目录;middleware为后来创建的自定义中间件目录

2. 中间件

koa是从第一个中间件开始执行,遇到 await next() 进入下一个中间件,一直执行到最后一个中间件,在逆序,执行上一个中间件,一直到第一个中间件执行结束才发出响应。

2.1 自定义中间件

创建文件夹middleware存放各种自定义中间件;

创建文件 koa-pv.js:

// 自定义中间件 koa-pv

function pv (ctx) {
global.console.log('当前路由', ctx.path) // 打印当前路由,node中全局不能用window,需要用global代替
} module.exports = function () {
return async function(ctx, next) {
pv(ctx)
await next() // 每个中间件都必须有这一句,用以执行下一个中间件
}
}

然后,在app.js中引入中间件

const pv = require('./middleware/koa-pv')

app.use(pv())

3. mongoose的使用

3.1 判断是否安装了mongo:

$ which mongod

3.2 运行 MongoDB

$ sudo mongod  

<!--

首先创建一个数据库存储目录 /data/db:

sudo mkdir -p /data/db

启动 mongodb,默认数据库目录即为 /data/db

参考:http://www.runoob.com/mongodb/mongodb-osx-install.html

如果已经有进程27017,需要先停止:

停止进程:
lsof -i :27017
kill -9 3243
-->

3.3 配置mongoose

在文件夹dbs中创建文件 config.js:

// 配置mongo 地址
module.exports = {
dbs: 'mongodb://127.0.0.1:27017/dbs'
}

3.4 创建数据表

在文件dbs 中创建文件夹models 用来存放不同的数据表。

创建文件person.js, 文件名person即为数据表名称。

person.js:

const mongoose = require('mongoose')

// 创建数据表模型,该文件的名字,即person,就是数据表的名字
// 下面给 person 表声明两个字段name和age let personSchema = new mongoose.Schema({
name: String,
age: Number
}) // 通过建 model 给 person 赋予增删改查等读写的功能
module.exports = mongoose.model('Person', personSchema)

3.5 连接koa2和mongoose

// 一、引入mongoose
const mongoose = require('mongoose')
const dbConfig = require('./dbs/config') // 二、 连接数据库的服务
mongoose.connect(dbConfig.dbs, {
useNewUrlParser: true
})

3.6 通过mongoose进行数据的增删改查

进入文件 routes/uses.js:

const router = require('koa-router')()
// 引入mongo模型
const Person = require('../dbs/models/person') router.prefix('/users') router.get('/', function (ctx, next) {
ctx.body = 'this is a users response!'
}) router.get('/bar', function (ctx, next) {
ctx.body = 'this is a users/bar response'
}) /**
* 一、 增加 内容 向person数据模型中
*
* 可以通过命令行执行:curl -d 'name=cck&age=27' http://localhost:3000/users/addPerson
* 若返回: {
"code": 0
}
证明添加数据成功。 注意: save()方法是model自带的写入数据的方法, 通过实例 person 写入
*/ router.post('/addPerson', async function (ctx) {
// 创建实例
const person = new Person({
name: ctx.request.body.name,
age: ctx.request.body.age
}) let code = 0 // 状态码 try {
await person.save()
code = 0
} catch(e) {
code = -1
} // 返回状态(成功为0, 错误为-1)
ctx.body = {
code
}
}) /**
* 二、 读取 内容 从person数据模型中
* 命令行中输入:curl -d 'name=cck' http://localhost:3000/users/getPerson
* 返回:{
"code": 0,
"result": {
"_id": "5beb91bcd6e7060ffcca6a46",
"name": "cck",
"age": 27,
"__v": 0
},
"results": [
{
"_id": "5beb91bcd6e7060ffcca6a46",
"name": "cck",
"age": 27,
"__v": 0
}
]
}
*
* 注意: findOne()和find()方法是model自带的读取数据的方法, 注意:这里直接通过模型 Person 写入 !!!
* findOne() 只是找到一条符合条件的内容
* find() 可以找到整个符合条件的集合(数组)
*/ router.post('/getPerson', async function (ctx) {
const result = await Person.findOne({
name: ctx.request.body.name
}) const results = await Person.find({
name: ctx.request.body.name
}) // 这里没有考虑异常,直接返回了结果
ctx.body = {
code: 0,
result,
results
}
}) /**
* 三、 修改 内容 从person数据模型中
* 命令行中输入:curl -d 'name=wy&age=19' http://localhost:3000/users/updatePerson
* 返回:{
"code": 0,
}
*
* 注意: where()和update()方法是model自带的读取数据的方法, 注意:这里直接通过模型 Person 写入 !!!
* where() 找到符合条件的内容
* update() 修改该内容
*/ router.post('/updatePerson', async function (ctx) {
// 找到符合条件的name,并修改其age
const result = await Person.where({
name: ctx.request.body.name
}).update({
age: ctx.request.body.age
}) // 这里没有考虑异常,直接返回了结果
ctx.body = {
code: 0
}
}) /**
* 四、 删除 内容 从person数据模型中
*
* 注意: where()和update()方法是model自带的读取数据的方法, 注意:这里直接通过模型 Person 写入 !!!
* where() 找到符合条件的内容
* remove() 删除该内容
*/ router.post('/removePerson', async function (ctx) {
// 找到符合条件的name,并修改其age
const result = await Person.where({
name: ctx.request.body.name
}).remove() // 这里没有考虑异常,直接返回了结果
ctx.body = {
code: 0
}
}) module.exports = router

参考

koa2 入门(1)koa-generator 脚手架和 mongoose 使用的更多相关文章

  1. koa2入门--03.koa中间件以及中间件执行流程

    //中间件:先访问app的中间件的执行顺序类似嵌套函数,由外到内,再由内到外 //应用级中间件 const koa = require('koa'); var router = require('ko ...

  2. koa2入门使用总结

    koa2的介绍 Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小.更富有表现力.更健壮的基石. 通过利用 async ...

  3. koa2入门(3)mongoose 增删改查

    项目地址:https://github.com/caochangkui/demo/tree/koa-mongoose 连接数据库 数据库名字为:koa-mongoose const mongoose ...

  4. koa generator

    Koa (koajs) -- 基于 Node.js 平台的下一代 web 开发框架 | Koajs... Koa 框架教程 koa入门 如何评价 Node.js 的koa框架?

  5. koa2入门(2) koa-router 路由处理

    项目地址:https://github.com/caochangkui/demo/tree/koa-test 1. 创建项目 创建目录 koa-test npm init 创建 package.jso ...

  6. Nuxt.js + koa2 入门

    1. nuxt项目初始化 下面是使用 koa 模板方法初始化一个项目,使用该方法需要将 nuxt 的版本降至1.4.2: 官方 https://zh.nuxtjs.org/guide/installa ...

  7. Gulp资料大全:入门、插件、脚手架、包清单

    awesome-gulp中文版 一份gulp的资源,插件和使用实例清单, 致力于打造更好的前端工程构建流程. 被老外的awesome 清单刺激到,觉得有必要翻译一份,为国产的程序员们做点事情,本清单将 ...

  8. 《ECMAScript6入门》笔记——Generator函数

    今天在看<ECMAScript6入门>的第17章——Generator函数的语法.理解起来还是有点费劲,几段代码看了很多遍.总算有点点理解了. 示例代码如下:(摘自阮一峰<ECMAS ...

  9. 最好用的koa2+mysql的RESTful API脚手架,mvc架构,支持node调试,pm2部署。

     #基于webpack构建的 Koa2 restful API 服务器脚手架    这是一个基于 Koa2 的轻量级 RESTful API Server 脚手架,支持 ES6, 支持使用TypeSc ...

随机推荐

  1. 解决在IDEA 的Maven下 出现 Cannot access in offline mode 问题

    去掉maven前面的work offline模式

  2. imei和imsi

    imei.imsi是大部分应用自动采集的设备信息,Android中需要在MINIFEST声明权限,6.0以上手机还需要用户显示授权才可以正常获取.这两个标识有什么区别.联系?为什么应用这么执着于采集这 ...

  3. android编写测试类

    由于网上很多教程,我就不多说.在这里我就说说我遇到的问题. 在android studio编写单元测试类中,在androidTest包下编写了两个类,分别如下 import junit.framewo ...

  4. docker in all

    docker vs hyper-v,vmware,xen,kvm docker host, docker container, docker engineen, docker image images ...

  5. linux内核完全剖析——基于0.12内核-笔记(2)-统一编址和独立编址

    IO是什么 ? IO(Input and Output)是输入输出接口.是CPU和其他外部设备(如串口.LCD.触摸屏.LED等)之间通信的接口.一般的,我们说的IO就是指CPU的各种内部或外部外设. ...

  6. 用JS制作《飞机大作战》游戏_第4讲(创建敌方飞机、敌方飞机发射子弹、玩家子弹击中敌方小飞机,小飞机死亡)-陈远波

    一.创建敌方飞机 1.思考创建思路: 创建敌方飞机思路与创建玩家飞机思路一样: (1)思考敌方飞机具备什么属性: 敌方飞机的图片.坐标.飞行速度.状态(是否被击中) 设置小飞机被击中时消失时间.飞机可 ...

  7. div+css ie6图片之间有间隙的问题

    图片转换为快级元素就解决了 img{display:block;} 也可设置img属性img{vertical-align:top;}

  8. Python高级网络编程系列之基础篇

    一.Socket简介 1.不同电脑上的进程如何通信? 进程间通信的首要问题是如何找到目标进程,也就是操作系统是如何唯一标识一个进程的! 在一台电脑上是只通过进程号PID,但在网络中是行不通的,因为每台 ...

  9. ethereum/EIPs-725

    https://github.com/ethereum/EIPs/blob/master/EIPS/eip-725.md eip title author discussions-to status ...

  10. Node.js实战(十)之EventEmitter

    Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列. Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs. ...