koa+mongoose实现简单增删改查接口的示例代码


Posted in Javascript onMay 13, 2019

配合上一篇文章的联系人应用(https://3water.com/article/161160.htm),实现配套的基于nodejs的后台增删改查接口

1. 所需工具

  • node.js
  • mongoDB

2. 主要node模块

koa(https://koa.bootcss.com,一个nodejs的开发框架),mongoose(https://mongoosejs.com,mongDB操作工具)

3. 目录结构

koa+mongoose实现简单增删改查接口的示例代码

4. 启动MongoDB

首先在MongoDB安装盘的根目录下(这里假设是D盘)新建一个文件夹data,然后在MongoDB的bin中打开终端,输入mongod --DBpath d:\data,这样MongoDB的数据存放地点就配置好了。

然后双击bin中的mongo.exe,mongoDB就启动完成了。

5. app.js

app.js为入口文件,功能是连接数据库,导入文件,引入koa组件,最后启动服务。

'use strict';

const fs = require('fs');
const path = require('path');
const mongoose = require('mongoose');

const db = 'mongodb://localhost/test';

/* 连接数据库 */
mongoose.Promise = require('bluebird');
mongoose.connect(db, {useMongoClient: true});

/**
 * 获取数据库表对应的js对象所在的路径
 * @type {[type]}
 */
const models_path = path.join(__dirname, '/app/models');

/**
 * 已递归的形式,读取models文件夹下的js模型文件,并require
 * @param {[type]} modelPath [description]
 * @return {[type]}   [description]
 */
let walk = function (modelPath) {
 fs.readdirSync(modelPath).forEach(function (file) {
  let filePath = path.join(modelPath, '/' + file)
  let stat = fs.statSync(filePath)

  if (stat.isFile()) {
   if (/(.*)\.(js|coffee)/.test(file)) {
    require(filePath)
   }
  }
  else if (stat.isDirectory()) {
   walk(filePath)
  }
 })
};
walk(models_path);

require('babel-register');
const Koa = require('koa');
const logger = require('koa-logger');
const session = require('koa-session');
const bodyParser = require('koa-bodyparser');
const app = new Koa();

app.use(logger());
app.use(session(app));
app.use(bodyParser());


/**
 * 使用路由转发请求
 * @type {[type]}
 */
const router = require('./config/router')();

app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3000);
console.log('app started at port 3000...');

6. 路由配置

路由配置在config/router.js中进行。

const Router = require('koa-router');
const User = require('../app/controllers/user');

module.exports = function () {
 let router = new Router({
  prefix: '/api'
 });

 router.post('/test/user/users', User.users);
 router.post('/test/user/user', User.user);
 router.post('/test/user/add', User.addUser);
 router.post('/test/user/delete', User.deleteUser);
 return router
};

post方法第一参数为路由地址,第二参数为路由地址对应的方法。 

7. 表结构定义

表结构定义在app/models/user.js中。

let mongoose = require('mongoose');
let Schema = mongoose.Schema;

// 定义表结构
let UserSchema = new Schema({
 name: {
  type: String,
  required: true
 },
 sex: String,
 area: String,
 always: Boolean,
 relationship: Array,
 mobile: String,
 phone: String,
 desc: String,
 id: String
});

// 参数User 数据库中的集合名称, 不存在会创建.
let User = mongoose.model('User', UserSchema);

module.exports = User;

8. 工具方法

一些增删改查的工具方法放在app/dbhelp/userHelp.js中

'use strict';

let mongoose = require('mongoose');
let User = mongoose.model('User');

/* 查找用户 */
exports.findAllUsers = async () => {
 let query = User.find();
 let res = [];
 await query.exec(function (err, users) {
  if (err) {
   res = [];
  } else {
   res = users;
  }
 });
 return res
};

/* 查找特定用户 */
exports.findFilterUsers = async (params) => {
 let nameReg = new RegExp(params.name, 'i');
 let query = User.find({
  name: {
   $regex: nameReg
  }
 });
 let res = [];
 await query.exec(function (err, users) {
  if (err) {
   res = []
  } else {
   res = users;
  }
 });
 return res
};

/* 查找单个用户 */
exports.findUser = async (params) => {
 let query = User.find({
  id: params.id
 });
 let res = {};
 await query.exec(function (err, tUser) {
  if (err) {
   res = '没有该用户';
  } else {
   res = tUser[0];
  }
 });
 return res
};

/* 新增用户 */
exports.addUser = async (user) => {
 user = await user.save();
 return user
};

/* 编辑用户 */
exports.updateUser = async (user) => {
 user = await User.update({id: user.id}, {
  $set: {
   name: user.name,
   sex: user.sex,
   area: user.area,
   always: user.always,
   relationship: user.relationship,
   phone: user.phone,
   mobile: user.mobile,
   desc: user.desc
  }
 });
 return user
};

/* 删除用户 */
exports.deleteUser = async ({id}) => {
 let flag = false;
 console.log('flag==========>' + flag);
 await User.remove({id}, function (err) {
  if (err) {
   flag = false
  } else {
   flag = true
  }

 });
 console.log('flag=====await=====>' + flag);
 return flag
};

9. 路由配置中对应的方法

路由配置中对应的方法在app/controller/user.js中。

'use strict';

let xss = require('xss');
let mongoose = require('mongoose');
let User = mongoose.model('User');
let uuid = require('uuid');
import userHelper from '../dbhelper/userHelper.js'

/* 多用户 */
exports.users = async (ctx, next) => {
 let data;
 if (ctx.request.body) {
  data = await userHelper.findFilterUsers(ctx.request.body)
 } else {
  data = await userHelper.findAllUsers()
 }

 ctx.body = {
  success: true,
  data
 }
};
/* 单用户 */
exports.user = async (ctx, next) => {
 let data = await userHelper.findUser(ctx.request.body)

 ctx.body = {
  success: true,
  data
 }
};
/* 添加(更新)用户 */
exports.addUser = async (ctx, next) => {
 let newObj = ctx.request.body,
  user2;
 let id = newObj.id || uuid.v4();
 let user = new User({
  name: newObj.name,
  sex: newObj.sex,
  area: newObj.area,
  always: newObj.always,
  relationship: newObj.relationship,
  phone: newObj.phone,
  mobile: newObj.mobile,
  desc: newObj.desc,
  id: id
 });
 if (newObj.id) {
  user2 = await userHelper.updateUser(user);
 } else {
  user2 = await userHelper.addUser(user);
 }

 if (user2) {
  ctx.body = {
   success: true,
   data: user2
  }
 }
};
/* 删除用户 */
exports.deleteUser = async (ctx, next) => {
 let id = xss(ctx.request.body.id);
 let data = await userHelper.deleteUser({id});
 ctx.body = {
  success: true,
  data
 }
};

总结:

其实没有什么花头,无非都是api的使用,这里比较多用async与await实现异步操作,阮老师的文章里有async的一切,http://es6.ruanyifeng.com/#docs/async。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
Aug 15 Javascript
javascript while语句和do while语句的区别分析
Dec 08 Javascript
javascript中的数字与字符串相加实例分析
Aug 14 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
Jan 21 Javascript
javascript判断非数字的简单例子
Jul 18 Javascript
简单实现js间歇或无缝滚动效果
Jun 29 Javascript
JS绘制微信小程序画布时钟
Dec 24 Javascript
关于js中的鼠标事件总结
Jul 11 Javascript
vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
Nov 27 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
May 28 Javascript
js实现无刷新监听URL的变化示例代码详解
Jun 03 Javascript
在vue中created、mounted等方法使用小结
Jul 21 Javascript
如何利用vue+vue-router+elementUI实现简易通讯录
May 13 #Javascript
vue百度地图 + 定位的详解
May 13 #Javascript
教你使用vue-cli快速构建的小说阅读器
May 13 #Javascript
详解js根据百度地图提供经纬度计算两点距离
May 13 #Javascript
解决前后端分离 vue+springboot 跨域 session+cookie失效问题
May 13 #Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
May 13 #Javascript
详解async/await 异步应用的常用场景
May 13 #Javascript
You might like
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
让PHP显示Facebook的粉丝数量方法
2014/01/08 PHP
Yii配置文件用法详解
2014/12/04 PHP
thinkPHP内置字符串截取函数用法详解
2016/11/15 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
JS支持带x身份证号码验证函数
2008/08/10 Javascript
jQuery-Tools-overlay 使用介绍
2012/07/14 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
两种方法解决javascript url post 特殊字符转义 + & #
2016/04/13 Javascript
JS简单循环遍历json数组的方法
2016/04/22 Javascript
JS中parseInt()和map()用法分析
2016/12/16 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
jQuery实现判断滚动条滚动到document底部的方法分析
2019/08/27 jQuery
微信小程序后端无法保持session的原因及解决办法问题
2020/03/20 Javascript
[17:13]DOTA2 HEROS教学视频教你分分钟做大人-斯拉克
2014/06/13 DOTA
python实现分析apache和nginx日志文件并输出访客ip列表的方法
2015/04/04 Python
Python实现比较两个列表(list)范围
2015/06/12 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
2019/10/24 Python
TensorFlow2.0矩阵与向量的加减乘实例
2020/02/07 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
美国益智玩具购物网站:Fat Brain Toys
2017/11/03 全球购物
俄罗斯家居用品购物网站:Евродом
2020/11/21 全球购物
一套PHP的笔试题
2013/05/31 面试题
垃圾回收的优点和原理。并考虑2种回收机制
2016/10/16 面试题
数字天堂软件测试面试题
2012/12/23 面试题
小学母亲节活动方案
2014/03/14 职场文书
党风廉政建设责任书
2014/04/14 职场文书
新闻编辑求职信
2014/07/13 职场文书
新兵入伍心得体会
2014/09/04 职场文书
房地产销售员岗位职责
2015/04/11 职场文书
2015年学校党建工作总结
2015/05/19 职场文书
法律意见书范文
2015/05/20 职场文书
亮剑观后感300字
2015/06/05 职场文书
关于保护环境的建议书
2019/06/24 职场文书
五年级作文之劳动作文
2019/11/12 职场文书