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 相关文章推荐
JavaScript怎么判断图片是否加载完成以便获取其尺寸
May 08 Javascript
采用call方式实现js继承
May 20 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
Jul 18 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
Jun 14 Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
Jun 14 Javascript
详解JavaScript常量定义
Jan 03 Javascript
JS区分Object与Aarry的六种方法总结
Feb 27 Javascript
详解angular 中的自定义指令之详解API
Jun 20 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
Apr 28 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
Jul 11 Javascript
JS实现集合的交集、补集、差集、去重运算示例【ES5与ES6写法】
Feb 18 Javascript
详解javascript 变量提升(Hoisting)
Mar 12 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
PHP 和 XML: 使用expat函数(一)
2006/10/09 PHP
php预定义常量
2006/12/25 PHP
PHP 将图片按创建时间进行分类存储的实现代码
2010/01/05 PHP
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
2014/09/12 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
2016/11/14 PHP
为何说PHP引用是个坑,要慎用
2018/04/02 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
javascript中字符串的定义示例代码
2013/12/19 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
2014/09/09 Javascript
详解javascript实现自定义事件
2016/01/19 Javascript
纯js实现手风琴效果
2020/04/17 Javascript
如何用JavaScript实现动态修改CSS样式表
2016/05/20 Javascript
JavaScript使用Range调色及透明度实例
2016/09/25 Javascript
jquery+css3问卷答题卡翻页动画效果示例
2016/10/26 Javascript
Node.js使用Express.Router的方法
2017/11/14 Javascript
用node.js写一个jenkins发版脚本
2019/05/21 Javascript
angular8和ngrx8结合使用的步骤介绍
2019/12/01 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
[04:03][TI9趣味短片] 小鸽子茶话会
2019/08/20 DOTA
Python实现提取文章摘要的方法
2015/04/21 Python
python递归删除指定目录及其所有内容的方法
2017/01/13 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
2020/06/11 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
2020/06/17 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
2020/10/15 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
Paul’s Boutique官网:英国时尚手袋品牌
2018/03/31 全球购物
俄罗斯运动鞋商店:Sneakerhead
2018/05/10 全球购物
美国一站式电动和手动工具商店:International Tool
2020/11/26 全球购物
酒店员工检讨书
2014/02/18 职场文书
关心下一代工作先进事迹
2014/08/15 职场文书
2014年艾滋病防治工作总结
2014/12/10 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书
如何书写读后感?(附范文)
2019/07/26 职场文书