项目地址:https://github.com/caochangkui/demo/tree/koa-mongoose

连接数据库

数据库名字为:koa-mongoose

const mongoose = require('mongoose')

// 连接数据库,URL以mongodb:// + [用户名:密码@] +数据库地址[:端口] + 数据库名。(默认端口27017)
// 连接mongodb数据库的链接解析器会在未来移除,要使用新的解析器,通过配置{ useNewUrlParser:true }来连接 ;其他警告参考:https://mongoosejs.com/docs/deprecations.html
mongoose.connect('mongodb://127.0.0.1:27017/koa-mongoose', {useNewUrlParser:true,useCreateIndex: true}) /**
* mongoose从@5.2.8后会弃用一些指令,为防止程序如下警告:
* (node:24864) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
* (node:24841) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
* 可以如下设置
*/
mongoose.set('useNewUrlParser', true)
mongoose.set('useFindAndModify', false)
mongoose.set('useCreateIndex', true) let db = mongoose.connection
mongoose.Promise = global.Promise // 防止Mongoose: mpromise 错误 db.on('error', function (err) {
console.log('数据库连接出错', err)
}) db.on('open', function () {
console.log('数据库连接成功')
}) db.on('disconnected', function () {
console.log('数据库连接断开')
})

创建数据表

/*
声明 Schema
创建数据表模型,即 User,就是数据表的名字
下面给 User 表声明三个字段 username password age
*/
const userSchema = mongoose.Schema({
username: {
type: String,
required: true
},
password: {
type: String,
require: true
},
age: {
type: Number,
require: true
}
}) // 根据 schema 生成 model
const model = {
User: mongoose.model('User', userSchema)
} module.exports = model

定义 mongoose 数据库操作方法

const User = require('../dbs.js').User // 从dbs.js引入数据表

/**
* 数据库操作
*/ // 增加用户,方法一:save()
const saveUser = async (ctx) => {
// 通过实例化一个 User 对象在添加用户
const newUser = new User({
username: 'cedric',
password: '123',
age: 27
}) let code = 0 // 状态码
let result = '' // 返回内容 try {
let doc = await newUser.save()
code = 0
result = '保存成功, ' + doc
} catch (err) {
code = -1
result = '保存失败, ' + err
} ctx.response.body = {
code,
result
}
return result
} // 增加用户,方法二:create(), 推荐此方法
// 使用save()方法,需要先实例化为文档,再使用save()方法保存文档。而create()方法,则直接在模型Model上操作,并且可以同时新增多个文档
const createUser = async (ctx) => {
let code = 0 // 状态码
let result = '' // 返回内容 try {
let doc = await User.create({
username: 'cedric222',
password: '123',
age: 27
}, {
username: 'cedric333',
password: '123',
age: 27
})
code = 0
result = '保存成功, ' + doc
} catch (err) {
code = -1
result = '保存失败, ' + err
console.log(err)
} ctx.response.body = {
code,
result
}
return result
} // 根据用户名查找用户
const findUser = async (ctx) => {
let code = 0 // 状态码
let result = '' // 返回内容 try {
let doc = await User.findOne({
username: 'cedric222'
})
code = 0
result = '查找结果: ' + doc
} catch (err) {
code = -1
result = '查找失败: ' + err
} ctx.response.body = {
code,
result
}
return result
} // 根据指定条件查找所有用户
// find指的是查找指定表的所有数据,返回的是数组
// findOne指的是查找指定表的单条数据,返回一个对象
const findAllUser = async (ctx) => {
let code = 0 // 状态码
let result = '' // 返回内容 try {
let doc = await User.find({})
code = 0
result = '查找结果: ' + doc
} catch (err) {
code = -1
result = '查找失败: ' + err
} ctx.response.body = {
code,
result
}
return result
} // 修改用户数据
// conditions: 查询条件;updateDoc:需要修改的数据, 都是一个对象
// multi (boolean): 默认为false。是否更新多个查询记录。
// https://segmentfault.com/a/1190000012095054#articleHeader16
// https://mongoosejs.com/docs/api.html#model_Model.update
const updateUser = async (ctx) => {
let code = 0 // 状态码
let result = '' // 返回内容 try {
let doc = await User.update({age: 27}, {age: 28}, {multi: true})
code = 0
result = '修改结果: ' + doc
console.log(doc)
} catch (err) {
code = -1
result = '修改失败: ' + err
} ctx.response.body = {
code,
result
}
return result
} // 删除用户数据
const removeUser = async (ctx) => {
let code = 0 // 状态码
let result = '' // 返回内容 try {
let doc = await User.remove({username: 'cedric444'})
code = 0
result = '删除成功: ' + doc
console.log(doc)
} catch (err) {
code = -1
result = '删除失败: ' + err
} ctx.response.body = {
code,
result
}
return result
} module.exports = {
saveUser,
createUser,
findUser,
findAllUser,
updateUser,
removeUser
}

入口文件app.js

const Koa = require('koa')
const app = new Koa(); const Router = require('koa-router') // koa路由中间件 const router = new Router({
prefix: '/api'
}) // 父路由, 给路由统一加个前缀 /api const bodyParser = require('koa-bodyparser') // 处理post请求,把 koa2 上下文的表单数据解析到 ctx.request.body 中
app.use(bodyParser()) // 引入数据库操作方法
const UserController = require('./server/controller/users.js') // 路由,访问:http://localhost:3333/api/save
router.get('/save', UserController.saveUser)
router.get('/create', UserController.createUser)
router.get('/find', UserController.findUser)
router.get('/findall', UserController.findAllUser)
router.get('/update', UserController.updateUser)
router.get('/remove', UserController.removeUser) // 加载路由中间件
app.use(router.routes())
// allowedMethods 处理的业务是当所有路由中间件执行完成之后,若ctx.status为空或者404的时候,丰富response对象的header头
app.use(router.allowedMethods()) app.listen(3333, () => {
console.log('This server is running at http://localhost:' + 3333)
})

koa2入门(3)mongoose 增删改查的更多相关文章

  1. Hibernate入门案例及增删改查

    一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...

  2. java springboot整合zookeeper入门教程(增删改查)

    java springboot整合zookeeper增删改查入门教程 zookeeper的安装与集群搭建参考:https://www.cnblogs.com/zwcry/p/10272506.html ...

  3. Series 入门(创建和增删改查)

    Series 是pandas两大数据结构中(DataFrame,Series)的一种.使用pandas 前需要将pandas 模块引入,因为Series和DataFrame用的次数非常多,所以将其引入 ...

  4. MVC 入门 自动生成 增删改查所有功能

    MVC现在版本已经是5了   EF现在最新的应该是6.0.2了 开发工具是 Visual Studio2013 数据库是 SQL Server 2012 这些需要.NET Framework4.5 的 ...

  5. MyBatis入门案例、增删改查

    一.MyBatis入门案例: ①:引入jar包 ②:创建实体类 Dept,并进行封装 ③ 在Src下创建大配置mybatis-config.xml <?xml version="1.0 ...

  6. MongoDB学习day07--mongoose入门,数据库增删改查,默认参数,模块化

    一.mongoose介绍 Mongoose 是在 node.js 异步环境下对 mongodb 进行便捷操作的对象模型工具. Mongoose 是 NodeJS 的驱动, 不能作为其他语言的驱动. M ...

  7. Hibernate-基础入门案例,增删改查

    项目结构: 数据库: /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.5.53 : Database - hibernate01 ************** ...

  8. express+mongodb+mongoose增删改查

    增加 修改 删除 数据库 这是一个前后端分离的项目前端项目地址:https://gitee.com/dingshao/express_qd.git后端项目地址:https://gitee.com/di ...

  9. node 实现Token状态登录 及数据库增删改查

    1.项目目录结构 2.启动入口文件代码index.js const express = require('express') const bodyParser = require('body-pars ...

随机推荐

  1. 阿里云 centos7 django + uWSGI+Nginx + python3 部署攻略

    centos7+nginx+python3+django+uwsgi配置Django 项目部署   1.租的服务器(选择centos)的话,需要在阿里云后台控制台开放几个端口,克隆一下已开放的端口,t ...

  2. JS数组分组

    //1.找出数组中相同的元素 getRepeatNum(arr) { let obj = {}; for (let i = 0, len = arr.length; i < len; i++) ...

  3. Python创建空DataFrame及添加行数据

    # 创建空DataFrame df = pd.DataFrame(columns = ['YJML','EJML','SJML','WZLB','GGXHPZ','CGMS']) # 插入数据(忽略索 ...

  4. python第五十一天----线程,Event,队列

    进程与线程的区别: 线程==指令集,进程==资源集  (线程集) 1.同一个进程中的线程共享内存空间,进程与进程之间是独立的 2.同一个进程中的线程是可以直接通讯交流的,进程与间通讯必需通过一个中间的 ...

  5. Vlc支持IE 360 低版本的Google浏览器

    VLC 插件代码: <object type='application/x-vlc-plugin' pluginspage="http://www.videolan.org/" ...

  6. Linux进程ID号--Linux进程的管理与调度(三)【转】

    Linux 内核使用 task_struct 数据结构来关联所有与进程有关的数据和结构,Linux 内核所有涉及到进程和程序的所有算法都是围绕该数据结构建立的,是内核中最重要的数据结构之一. 该数据结 ...

  7. IDEA 编译 Jmeter 5.0(二次开发)

    windows10 操作系统,jdk1.8,Intellij IDEA 2018,jmeter5.0 1.下载 http://jmeter.apache.org/download_jmeter.cgi ...

  8. javascript获取DOM对象三种方法

    1. getElementByID() getElementByID()方法可返回对拥有指定ID的第一个对象的引用 2. getElementByTagName() getElementByTagNa ...

  9. January 06th, 2018 Week 01st Saturday

    In life the most interesting things tend to happen when you are on your way to do something else. 生活 ...

  10. 西安80投影坐标系转WGS84地理坐标系如何求七参数

    需求:西安80投影坐标系(平面坐标)转为WGS84地理坐标系(球面坐标) 这其中涉及的问题主要有以下两点: 1.一个是投影坐标系,一个是地理坐标系,而七参数指的是两个地理坐标系之间的转换,因此需要把投 ...