手把手教你基于koa2,mongoose实现增删改查
初始化项目
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实现增删改查的更多相关文章
- mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...
- 【转】mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
mongoDB 学习笔记纯干货(mongoose.增删改查.聚合.索引.连接.备份与恢复.监控等等) http://www.cnblogs.com/bxm0927/p/7159556.html
- 基于pymysql模块的增删改查
上课笔记 重点:(熟练)多表查询创建存储过程原生sql索引原理 pymysql 封装好的客户端cursor 底层就是一个send操作commit 告诉mysql真的要完成修改操作(不然修改不会生效)e ...
- mongoDB (mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
MongoDB - 简介 官网:https://www.mongodb.com/ MongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储 ...
- 基于DRF的图书增删改查练习
功能演示 信息展示 添加功能 编辑功能 删除功能 DRF构建后台数据 本例的Model如下 from django.db import models class Publish(models.Mode ...
- 基于DRF的图书增删改查
功能演示 信息展示 添加功能 编辑功能 删除功能 DRF构建后台数据 本例的Model如下 from django.db import models class Publish(models.Mode ...
- Python Web实战:Python+Django+MySQL实现基于Web版的增删改查
前言 本篇使用Python Web框架Django连接和操作MySQL数据库学生信息管理系统(SMS),主要包含对学生信息增删改查功能,旨在快速入门Python Web,少走弯路.效果演示在项目实战最 ...
- 基于springmvc的简单增删改查实现---中间使用到了bean validation
package com.kite.controller; import java.util.HashMap; import java.util.Map; import javax.validation ...
- MVC3学习:基于ObjectContext的数据增删改查操作
数据库里面的表格,映射为对应的实体类.实体类的编写,可以自己手动编写,也可以使用工具或插件自动生成.在MVC3里面,我们可以使用VS的POCO插件自动生成实体类.如下图: 关于POCO插件的安装与使用 ...
随机推荐
- pytorch利用多个GPU并行计算多gpu
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Answer3664/article/de ...
- 关闭myeclipse可视化视图
ctrl+w 关闭各个文件 重新打开即可 方法二:
- 笔记:在 Windows 10 WSL Ubuntu 18.04 安装 Odoo12 (2019-06-09)
笔记:在 Windows 10 WSL Ubuntu 18.04 安装 Odoo12 原因 为了和服务器一样的运行环境. 使用 Ubuntu 运行 Odoo 运行更快. 方便使用 Windows 10 ...
- 巨蟒python全栈开发-第11阶段 ansible_project2
一个NB的网站: https://www.toolfk.com/ CDN:将用户的需求送到最近的节点:内容分发网络 有些是专门做CDN的工具 常用的markdown是需要知道的,短信有字数限制. we ...
- python字符串、元组常用操作
常用字符串操作函数: #Author:CGQ name="I \tam ChenGuoQiang" print(name.capitalize())#首字母大写,其他都小写 pri ...
- Unity3dShader学习合集暂存
http://www.cnblogs.com/flappy/archive/2012/08/10/2631348.html 1. Unity3d的參考手冊, 里面涵盖Unity3d官方的描写叙述 ht ...
- 如何创建一个非常酷的3D效果菜单
http://www.cocoachina.com/ios/20150603/11992.html 原文地址在这里.原文 去年,读者们投票选出了Top5的iOS7最佳动画,当然也很想看到有关这些动画如 ...
- laravel 5.6 请教邮件中的cc,bcc是什么意思,有什么用?
cc指抄送 bcc指暗送. cc:carbon copy bcc:blind carbon copy
- Win7如何显示文件后缀
有些时候,我们需要修改文件的后缀名,但是Windows7系统默认不显示文件后缀.我们怎样显示和修改文件后缀呢?请接着往下看. 工具/原料 一个win7系统 方法/步骤 1 如图所示,此时是无法 ...
- Google Colab 免费GPU服务器使用教程 挂载云端硬盘
一.前言二.Google Colab特征三.开始使用3.1在谷歌云盘上创建文件夹3.2创建Colaboratory3.3创建完成四.设置GPU运行五.运行.py文件5.1安装必要库5.2 挂载云端硬盘 ...