• 初始化项目
npm init -y
  • 先安装一波乱七八糟的依赖插件(需要具备一定的koa2知识,至于mongoDB自行百度安装教程),模板引擎我使用的是art-template(据说是性能最好的,而且是因为JQ时代的产物,念旧)
npm i koa koa-router koa-bodyparser koa-static koa-views art-template koa-art-template mongoose  -S
  • 安装nodemon实时监听修改
npm i nodemon -D
  • 新建app.js入口文件,撸一把基础代码
const Koa = require('koa')
const app = new Koa()
const views = require('koa-views') const bodyParser = require('koa-bodyparser')
// const Router = require('koa-router')
const path = require('path')
// const router = new Router() const {connect} = require('./dbs/init.js') //导入mongodb数据库
const {createUser} = require('./controller/users.js') // 模板引擎
const render = require('koa-art-template');
render(app, {
root: path.join(__dirname, 'views'),
extname: '.html',
debug: process.env.NODE_ENV !== 'production'
}); //自执行函数,链接数据库
;(async ()=>{
await connect()
})() const userRouter = require('./controller/users.js')
app.use(userRouter.routes(),userRouter.allowedMethods())
// app.use(router.routes(),router.allowedMethods()) app
.use(bodyParser({enableTypes:['json', 'form', 'text']}))
.use(require('koa-static')(__dirname + '/public'))
.use(views(__dirname + '/views', {
extension: 'html'
})) app.listen(4000,()=>{
console.log('listen at port localhost:4000 ');
})
  • 新建dbs文件夹,在下面统一管理数据库相关,新建init.js数据库初始化
const mongoose = require('mongoose')
const db = 'mongodb://localhost/mongo_test'; //link
// const glob = require('glob')
// const {resolve} = require('path') // exports.initSchemas = ()=>{
// // glob.sync(resolve(__dirname,'./schema','**/*.js')).forEach(require)
// } // 连接数据库,URL以mongodb:// + [用户名:密码@] +数据库地址[:端口] + 数据库名。(默认端口27017)
// 连接mongodb数据库的链接解析器会在未来移除,要使用新的解析器,通过配置{ useNewUrlParser:true }来连接 ;其他警告参考:https://mongoosejs.com/docs/deprecations.html /**
* 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 dbc = mongoose.connection
exports.connect = ()=> {
// 链接数据库
mongoose.connect(db)
let maxConnectTimes = 0 return new Promise((resolve,reject)=>{ // 增加数据库监听事件:断开链接
dbc.on('disconnected',()=>{
console.log('***********数据库断开***********')
if(maxConnectTimes<=3){
maxConnectTimes++
mongoose.connect(db)
}
else {
reject()
throw new Error('数据库出现问题,请人为修理.....')
}
}) dbc.on('error',err=>{
console.log('***********数据库出错***********')
if(maxConnectTimes<=3){
maxConnectTimes++
mongoose.connect(db)
}
else {
reject()
throw new Error('数据库出现问题,请人为修理.....')
} }) dbc.once('open',()=>{
console.log('MongoDB Connected successfully!')
resolve()
})
}) }
  • 在dbs文件夹下新建schema文件夹用于创建各种schema表,新建Users.js
const mongoose = require('mongoose');

const Schema = mongoose.Schema;

let ObjectId = Schema.Types.ObjectId;

const userSchema = new Schema({
UserId : {type:ObjectId},
userName:{unique:true,type:String},//unique表示索引唯一
password:String,
gender:Number,
userStatus:Number,
createAt:{type:Date,default:Date.now()},
lastLoginAt:{type:Date,default:Date.now()}
},{collection:'users'}) const model = {
Users:mongoose.model('Users',userSchema)
} // 发布模型
module.exports = model
  • 新建controller文件夹,主要是用来处理一些业务逻辑,新建users.js文件
let {
addUser,
updateUser,
delUser,
findAllUsers,
findOne
} = require('./tools.js'); const common = require("../libs/common");
const Users = require('../dbs/schema/Users.js').Users
const Router = require('koa-router') ; let router = new Router()
router.prefix('/user')
// 查找列表
router.get('/list',async (ctx)=>{
let code = 0 // 状态码
let msg = '' // 返回内容
let {keyword} = ctx.query ;
let params = {
keyword
}
let ret = await findAllUsers(params)
ctx.body = {
code,
list:ret,
msg:'操作成功'
}
})
// 查找信息
router.get('/detail',async (ctx)=>{
let code = 0 // 状态码
let msg = '' // 返回内容
let {id} = ctx.query ;
let params = {
id
}
let ret = await findOne(params)
ctx.body = {
code,
list:ret,
msg:'操作成功'
}
})
router.post('/addUser',async (ctx)=>{
let code = 0 // 状态码
let msg = '' // 返回内容 let {userName,password,gender,type,id} = ctx.request.body ; if(type=='edit'){
if(id){
let ret = await updateUser(ctx.request.body)
if(ret.ok==1){
code = 0
msg = '修改成功'
}
else {
code = -1
msg = '修改失败,'
}
}
else{
code = -1
msg = '参数错误,'
}
}
// 删除
else {
// let id = common.uuid();
let user = new Users({
userName,
password,
gender,
userStatus:1
})
try {
let ret = await addUser(user)
console.log(ret); code = 0
msg = '添加成功'
} catch (error) {
code = -1
msg = '新建失败'
}
}
ctx.body = {
code,
msg
}
}) router.post('/del',async (ctx)=>{
let code = 0 // 状态码
let msg = '' // 返回内容
let ret = await delUser(ctx.request.body)
console.log(ret); if(ret){
ctx.body = {
code,
msg:'删除成功'
}
}
else {
ctx.body = {
code:-1,
msg:'参数错误'
}
}
})
module.exports = router
  • 在当前controller目录下新建增删改查工具方法,tools.js
// 导入schama
const Users = require('../dbs/schema/Users.js').Users
/* 查所有用户 */
exports.findAllUsers = async (params) => {
let keyword = params.keyword ||'' ;
const reg = new RegExp(keyword, 'i') //不区分大小写
// 模糊查询
let _filter = {
userStatus:1,
$or:[
{
userName:{$regex :reg}
}
]
}
let count = 0
count = await Users.countDocuments(_filter) let ret = await Users.find(_filter).limit(20)
let _list = ret.map(v=>{
return {
username:v.userName,
gender:v.gender,
createAt:v.createAt,
lastLoginAt:v.lastLoginAt,
}
})
return {
count,
list:_list
} };
/* 查单个用户 */
exports.findOne = async (params) => {
let ret = await Users.findOne({_id:params.id})
let info = {
id:ret._id,
userName:ret.userName,
createAt:ret.createAt,
lastLoginAt:ret.lastLoginAt,
gender:ret.gender
}
return {
info
}
};
/* 新增用户 */
exports.addUser = async (userParams) => {
console.log('add=');
console.log(userParams);
return await userParams.save();
}; /**
* 编辑
*/
exports.updateUser = async (userParams)=>{
console.log('edit=');
console.log(userParams); return await Users.updateOne({_id:userParams.id},{
$set:{
userName:userParams.userName,
password:userParams.password,
gender:userParams.gender
}
})
} /**
* 硬删除
*/
exports.removeUser = async (userParams)=>{
return await Users.findOneAndRemove({_id:userParams.id})
}
/**
* 软删除
*/
exports.delUser = async (userParams)=>{
return await Users.findOneAndUpdate({_id:userParams.id},{userStatus:0})
}
  • 运行代码:配置package.json,scripts新增"dev": "nodemon node ./app.js"

  • 运行:npm run dev

  • loacahost:4000/user/list获取列表

  • loacahost:4000/user/detail获取用户详情

  • loacahost:4000/user/addUser新增用户

  • loacahost:4000/user/del删除用户

手把手教你基于koa2,mongoose实现增删改查的更多相关文章

  1. mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...

  2. 【转】mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    mongoDB 学习笔记纯干货(mongoose.增删改查.聚合.索引.连接.备份与恢复.监控等等) http://www.cnblogs.com/bxm0927/p/7159556.html

  3. 基于pymysql模块的增删改查

    上课笔记 重点:(熟练)多表查询创建存储过程原生sql索引原理 pymysql 封装好的客户端cursor 底层就是一个send操作commit 告诉mysql真的要完成修改操作(不然修改不会生效)e ...

  4. mongoDB (mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    MongoDB - 简介 官网:https://www.mongodb.com/ MongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储 ...

  5. 基于DRF的图书增删改查练习

    功能演示 信息展示 添加功能 编辑功能 删除功能 DRF构建后台数据 本例的Model如下 from django.db import models class Publish(models.Mode ...

  6. 基于DRF的图书增删改查

    功能演示 信息展示 添加功能 编辑功能 删除功能 DRF构建后台数据 本例的Model如下 from django.db import models class Publish(models.Mode ...

  7. Python Web实战:Python+Django+MySQL实现基于Web版的增删改查

    前言 本篇使用Python Web框架Django连接和操作MySQL数据库学生信息管理系统(SMS),主要包含对学生信息增删改查功能,旨在快速入门Python Web,少走弯路.效果演示在项目实战最 ...

  8. 基于springmvc的简单增删改查实现---中间使用到了bean validation

    package com.kite.controller; import java.util.HashMap; import java.util.Map; import javax.validation ...

  9. MVC3学习:基于ObjectContext的数据增删改查操作

    数据库里面的表格,映射为对应的实体类.实体类的编写,可以自己手动编写,也可以使用工具或插件自动生成.在MVC3里面,我们可以使用VS的POCO插件自动生成实体类.如下图: 关于POCO插件的安装与使用 ...

随机推荐

  1. 简单利用XSS获取Cookie信息实例演示

    简单利用XSS获取Cookie信息实例演示   首先要找到一个有XXS的站,这里就不整什么大站了,谷歌一下inurl:'Product.asp?BigClassName',搜出来的命中率也比较高.随便 ...

  2. NS2学习笔记

    这两天在调一个仿真程序,比较奇怪的错误,就是一个节点广播消息,在它通信半径内的节点收不到消息,一直在通信上找问题,找了半天也没找到. 最后,用gdb调试,发现在一个操作指针处发生了段错误,引起的原因时 ...

  3. 介绍配置管理工具SVN的使用

    配置管理CM(Configuration Mangerment) 一.配置管理工具SVN的介绍 ---Subversion ---是一个开放源代码的版本控制系统 ---时下流行的SVN和GIT 每天开 ...

  4. SDUT-2124_基于邻接矩阵的广度优先搜索遍历

    数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定一个无向连通图 ...

  5. Docker容器中安装新的程序

    在容器里面安装一个简单的程序(ping). 之前下载的是ubuntu的镜像,则可以使用ubuntu的apt-get命令来安装ping程序:apt-get install -y ping. $docke ...

  6. ADT上跑java application

    Invalid layout of java.lang.String at value## A fatal error has been detected by the Java Runtime En ...

  7. 64位Linux编译C代码,crt1.o文件格式不对的问题

    今天在某台64位LInux下编译一个简单的hello world的C程序,报错: /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../crt1.o: cou ...

  8. 一些关于中国剩余定理的数论题(POJ 2891/HDU 3579/HDU 1573/HDU 1930)

    2891 -- Strange Way to Express Integers import java.math.BigInteger; import java.util.Scanner; publi ...

  9. H3C 广域网连接方式

  10. 2019-9-9-dotnet-获取本机-IP-地址方法

    title author date CreateTime categories dotnet 获取本机 IP 地址方法 lindexi 2019-09-09 15:56:33 +0800 2019-0 ...