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 ...
随机推荐
- 阿里云 centos7 django + uWSGI+Nginx + python3 部署攻略
centos7+nginx+python3+django+uwsgi配置Django 项目部署 1.租的服务器(选择centos)的话,需要在阿里云后台控制台开放几个端口,克隆一下已开放的端口,t ...
- JS数组分组
//1.找出数组中相同的元素 getRepeatNum(arr) { let obj = {}; for (let i = 0, len = arr.length; i < len; i++) ...
- Python创建空DataFrame及添加行数据
# 创建空DataFrame df = pd.DataFrame(columns = ['YJML','EJML','SJML','WZLB','GGXHPZ','CGMS']) # 插入数据(忽略索 ...
- python第五十一天----线程,Event,队列
进程与线程的区别: 线程==指令集,进程==资源集 (线程集) 1.同一个进程中的线程共享内存空间,进程与进程之间是独立的 2.同一个进程中的线程是可以直接通讯交流的,进程与间通讯必需通过一个中间的 ...
- Vlc支持IE 360 低版本的Google浏览器
VLC 插件代码: <object type='application/x-vlc-plugin' pluginspage="http://www.videolan.org/" ...
- Linux进程ID号--Linux进程的管理与调度(三)【转】
Linux 内核使用 task_struct 数据结构来关联所有与进程有关的数据和结构,Linux 内核所有涉及到进程和程序的所有算法都是围绕该数据结构建立的,是内核中最重要的数据结构之一. 该数据结 ...
- IDEA 编译 Jmeter 5.0(二次开发)
windows10 操作系统,jdk1.8,Intellij IDEA 2018,jmeter5.0 1.下载 http://jmeter.apache.org/download_jmeter.cgi ...
- javascript获取DOM对象三种方法
1. getElementByID() getElementByID()方法可返回对拥有指定ID的第一个对象的引用 2. getElementByTagName() getElementByTagNa ...
- 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. 生活 ...
- 西安80投影坐标系转WGS84地理坐标系如何求七参数
需求:西安80投影坐标系(平面坐标)转为WGS84地理坐标系(球面坐标) 这其中涉及的问题主要有以下两点: 1.一个是投影坐标系,一个是地理坐标系,而七参数指的是两个地理坐标系之间的转换,因此需要把投 ...