koa2入门(3)mongoose 增删改查
项目地址: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 增删改查的更多相关文章
- Hibernate入门案例及增删改查
一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...
- java springboot整合zookeeper入门教程(增删改查)
java springboot整合zookeeper增删改查入门教程 zookeeper的安装与集群搭建参考:https://www.cnblogs.com/zwcry/p/10272506.html ...
- Series 入门(创建和增删改查)
Series 是pandas两大数据结构中(DataFrame,Series)的一种.使用pandas 前需要将pandas 模块引入,因为Series和DataFrame用的次数非常多,所以将其引入 ...
- MVC 入门 自动生成 增删改查所有功能
MVC现在版本已经是5了 EF现在最新的应该是6.0.2了 开发工具是 Visual Studio2013 数据库是 SQL Server 2012 这些需要.NET Framework4.5 的 ...
- MyBatis入门案例、增删改查
一.MyBatis入门案例: ①:引入jar包 ②:创建实体类 Dept,并进行封装 ③ 在Src下创建大配置mybatis-config.xml <?xml version="1.0 ...
- MongoDB学习day07--mongoose入门,数据库增删改查,默认参数,模块化
一.mongoose介绍 Mongoose 是在 node.js 异步环境下对 mongodb 进行便捷操作的对象模型工具. Mongoose 是 NodeJS 的驱动, 不能作为其他语言的驱动. M ...
- Hibernate-基础入门案例,增删改查
项目结构: 数据库: /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.5.53 : Database - hibernate01 ************** ...
- express+mongodb+mongoose增删改查
增加 修改 删除 数据库 这是一个前后端分离的项目前端项目地址:https://gitee.com/dingshao/express_qd.git后端项目地址:https://gitee.com/di ...
- node 实现Token状态登录 及数据库增删改查
1.项目目录结构 2.启动入口文件代码index.js const express = require('express') const bodyParser = require('body-pars ...
随机推荐
- [20180713]关于hash join 测试中一个疑问.txt
[20180713]关于hash join 测试中一个疑问.txt --//上个星期做的测试,链接: http://blog.itpub.net/267265/viewspace-2157424/-- ...
- [20180614]删除bootstrap$记录无法启动2.txt
[20180614]删除bootstrap$记录无法启动2.txt --//前几天看链接http://www.xifenfei.com/2018/05/willfully-delete-bootstr ...
- oracle 日期格式化 TO_CHAR (datetime) 修饰语和后缀
Datetime Format Element Suffixes Suffix Meaning Example Element Example Value TH Ordinal Number DDTH ...
- 3.4Python数据处理篇之Numpy系列(四)---ndarray 数组的运算
目录 目录 (一)数组与标量的运算 1.说明: 2.实例: (二)元素级的运算(一元函数) 1.说明: 2.实例: (三)数组级的运算(二元函数) 1.说明: 2.实例: 目录 1.数组与标量的运算 ...
- jeDate 日期控件
写在前面的话: 最近在做一个日期范围的功能,研究了一个12306网站的日期范围选择,他用的是jcalendar.js,没有直接在日历插件里面做判断开始时间小于结束时间 而是自己在代码里面做了判断如下: ...
- Django之知识总结
1. 课程介绍 - 数据类型 - 函数 - 面向对象三大特性:继承,封装,多态 - socket:本质传输字节:所有网络通信都基于socket - 数据库设计:单表.FK.M2M (自己作业:自己领域 ...
- centos7下安装docker(13.1docker存储--data volume)
我们现在知道docker 有两种存储方式:storage driver和data volume stroage driver这种存储方式主要是存储那些无状态的数据,是镜像层和容器层组成的,而data ...
- Docker部署HDFS
docker部署hadoop只是实验目的,每个服务都是通过手动部署,比如namenode, datanode, journalnode等.如果为了灵活的管理集群,而不使用官方封装好的自动化部署脚本,本 ...
- darknet优化经验-AlexeyAB大神经验
目录 darknet优化经验 1. AlexeyAB改进项 2. Linux下编译选项 3. 训练经验 4. 提升检测效果 5. 总结 6. AlexeyAB大神改进 darknet优化经验 主要来自 ...
- [TJOI2018]教科书般的亵渎
嘟嘟嘟 题面挺迷的,拿第一个样例说一下: 放第一次亵渎,对答案产生了\(\sum_{i = 1} ^ {10} i ^ {m + 1} - 5 ^ {m + 1}\)的贡献,第二次亵渎产生了\(\su ...