• 初始化项目
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. 用五种不同的布局方式实现“左右300px中间自适应”的效果

    float浮动 <section class="layout float"> <style media="screen"> .layou ...

  2. PLAY2.6-SCALA(四) 请求体解析器

    一个http请求是一个请求头后面跟着一个请求体,头部信息比较短,可以安全的缓存在内存中,在Play中头部信息使用RequestHeader类进行建模.请求体的内容可能较大,使用流stream的形式进行 ...

  3. JavaScript--天猫数量输入框

    <!DOCTYPE html> <head> <meta charset="utf-8" /> <title>无标题文档</t ...

  4. hdu2897 巴什博奕

    n%(q+p)==0,也就是说先手必胜; n%(q+p)<=p,先手必输; n%(q+p)==k if(k>p&&k<=q)先手必胜; if(k>p&& ...

  5. JavaScript的六种数据类型与隐式转换

    一.六种数据类型 javascript的数据类型包括: (1)基本数据类型:number.string.boolean.null.undefined (2)对象:object object又包括Fun ...

  6. Gym - 101962B_Color Changing Sofa

    题意:将一个沙发放到一个分成好几个色块(一个字母代表一种颜色)的房间里,要求沙发染成跟所在色块一样的颜色,沙发分成(0,1)两种,0可以染成一种颜色,1可以染成一种颜色(换句话说,沙发最多两种颜色), ...

  7. 洛谷 1463[SDOI2005] 反素数ant

    题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6 ...

  8. UVa 10520【递推 搜索】

    UVa 10520 哇!简直恶心的递推,生推了半天..感觉题不难,但是恶心,不推出来又难受..一不小心还A了[]~( ̄▽ ̄)~*,AC的猝不及防... 先递推求出f[i][1](1<=i< ...

  9. python 内置函数补充 or 递归 or 二分法

    一.内置函数的补充 repr() 显示出字符串的官方表示形式 chr() print(chr(20013)) # 把数字编码转换成字符串 ord() print(ord('中')) # 20013 把 ...

  10. 【vb.net机房收费系统】之没有包含要从继承的组件的已生成程序集 标签: vb.net继承 2015-05-02 15:19 1012人阅读

    在敲到组合查询这个功能的时候,需要用到窗体的继承,但是在新建继承窗体的时候,出现了错误(没有包含要从继承的组件的已生成程序集).如下图: 问题的产生:当时没怎么注意,也不知道怎么弄的,最后反正是继承上 ...