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 ...
随机推荐
- android.support不统一的问题
今天supprt28遇到的问题,由于28还是预览版,还存在一些bug 都是因为如果程序内出现不同的,support或者其他外部引用库的多个版本,Gradle在进行合并的时候会使用本地持有的,最高版本的 ...
- wx python 基本控件
一.静态文本控件 wx.StaticText(parent, id, label, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, n ...
- python第四天 三级菜单新思路
今天是一个坎,在做三级菜单时卡住了,因为想要简洁的代码,就要用到递归函数,卡的不要不要的!不过最后在同学老师的提点帮助下,还是解决了! 2017-5-10发现之前的代码有BUG今天 修改了! 作业要求 ...
- NetBeans数据库笔记---三层架构
1.创建数据库,数据表 用MySQL数据库和Navicat for MySQL工具创建表 2.创建实体类——反应表结构(列——变量) 也就是对应表建立的gets和sets方法,实体类的名字一般都与数据 ...
- Windows:添加、删除和修改静态路由
添加一条路由 route add 删除一条路由 route add -p #作用同上,只是这是一条永久路由,不会因为重启机器而丢失. 注意:如果有两条路由记录有着相同的“目的网络号”,则会将两条记录 ...
- Selenium 、WebDriver :Capability
Selenium | WebDriver Capability 内容摘要: 1.WebDriver 通用配置 2.RemoteWebDriver特有配置 3.Grid特有配置 4.在使用特定浏览器时的 ...
- 【原创】Linux常用命令记录
1. 查看网络状态分布 #!/bin/sh netstat -apn >/dev/ \ | awk 'BEGIN {printf("%-15s%-15s%-15s%-15s\n&quo ...
- visual studio code前端插件及常用快捷键【转】
通用插件 HTML Snippets 超级实用且初级的 H5代码片段以及提示 HTML CSS Support 让 html 标签上写class 智能提示当前项目所支持的样式新版已经支持scss文件检 ...
- 组件的三大属性state,props,refs与事件处理
组件的三大属性state state是组件对象最重要的属性, 值是对象(可以包含多个数据),组件被称为"状态机", 通过更新组件的state来更新对应的页面显示(重新渲染组件) 初 ...
- eclipse 自动创建web.xml
eclipse 自动创建web.xml 以前每次创建web项目的时候,总是从其他的项目中拷贝一个web.xml文件到新项目,然后改吧改吧就可以了,但是这终究是一件麻烦的事,要是能够通过软件自动创建,那 ...