• 初始化项目
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. C++之以分隔符的形式获取字符串

    void CConvert::Split(const std::string& src, const std::string& separator, std::vector<st ...

  2. (四)IO流之InputStream和OutputStream

    InputStream:定义了字节输入流的抽象类 OutputStream:定义了字节输出流的抽象类;该类所有方法返回void值 FileInputStream:继承InputStream FileO ...

  3. 从程序员的角度分析微信小程序

    昨天朋友圈被微信小程序刷爆了. 我赶快在书架上拿出三年前买的书,把上面的土擦干净,压压惊. 作为一个并不是资深的程序员. 从程序员的角度分析一下微信小程序,欢迎指点. 首先吐槽 微信小程序只发了200 ...

  4. laravel 参数设置

    路由命名 Route::get('user/{id?}', function ($id = 1) { return "用户ID: " . $id; })->name('use ...

  5. TP3.2的URL重写省略index.php问题

    1. 在tp3框架的配置文件里,明确指定了路由的格式,这个配置位于thinkPHP文件夹下的conf文件夹里的convention.php中,修改以下字段 'URL_MODEL' => 2, # ...

  6. python 编码检测工具——chardet

  7. sql —— group by

    说明: 从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理. 原表: 执行分组查询: select G ...

  8. OpenCV 新手教程 之环境配置 + 图片匹配 matchTemplate

    1.什么是OpenCV OpenCV的全称是:Open Source Computer Vision Library. OpenCV是一个基于(开源)发行的跨平台计算机视觉库,能够执行在Linux.W ...

  9. java代码简单实现队列

    1. 基于链表简单实现 import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; / ...

  10. oralce ROLLUP

    select id,area,stu_type,sum(score) score from students group by rollup(id,area,stu_type) order by id ...