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 ...
随机推荐
- Expo大作战(三十三)--expo sdk api之MapView(地图),MailComposer(磁力传感计),Lottie(动画)
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- XP环境下C# 调用Pocess.start()时提示文件找不到的错误解决办法
错误提示如下: System.ComponentModel.Win32Exception (0x80004005): 系统找不到指定的文件. 在 System.Diagnostics.Process. ...
- JMeter—定时器(八)
参考<全栈性能测试修炼宝典JMeter实战>第六章 JMeter 元件详解中第三节定时器 JMeter中的定时器一般用来设置延迟与同步.定时器的执行优先级高于取样器,在同一作用域下有多个定 ...
- 【转】解决weblogic启动慢和创建域慢的方法
创建域慢启动慢的特征:创建域到70%时,进程长时间等待(命令行创建时停止在100%处),创建域启动Weblogic的时候也是长时间停止. Weblogic在Linux下启动慢的原因,发现从进程堆来看, ...
- Linux文件和目录的粘滞位(sticky bit)
今天维护系统时发现一个非常诡异的问题:AAA用户和BBB用户同属AAA组,但用AAA用户创建的文件,权限设置为777后,还是不能用BBB用户删除.诡异! 几经周转,发现AAA用户创建文件位置的上层目录 ...
- 7.1Python异常处理
目录 目录 前言 (一)常见的异常 (二)异常的处理 ==1.异常的预防:== ==2.解决已经知道类型的异常== ==3.合并处理多个异常== ==4处理未知类型的异常== (三)with语句 目录 ...
- Vue、Vuex+Cookie 实现自动登陆 。
概述 1.自动登陆实现思路. 2.vuex + cookie 多标签页状态保持. 自动登陆的需求: 1.登陆时勾选自动登陆,退出登陆或登陆到期后再次登陆后自动填写表单(记住密码)或访问登陆页自动登陆. ...
- C语言变量定义与数据溢出(初学者)
1.变量定义的一般形式为:类型说明符.变量名标识符等:例:int a,b,c;(abc为整型变量) 在书写变量定义时应注意以下几点: (1)允许在一个类型说明符后,定义多个相同类型的变量.各变量之间用 ...
- JdbcTemolate类的介绍<一>
JdbcTemolate类的介绍 JdbcTemplate是Spring JDBC的核心类,封装了常见的JDBC的用法,同时尽量避免常见的错误.该类简化JDBC的操作,我们只需要书写提供SQL的代码和 ...
- 基于SpringCloud的服务注册和调用
一:服务的注册和发现 Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry(注册登记)和Service Discovery(发现)实现.也是s ...