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实现的WEB页面跳转以及页面间传值方法
May 13 Javascript
JavaScript高级程序设计 学习笔记 js高级技巧
Sep 20 Javascript
javascript打印输出json实例
Nov 11 Javascript
Javascript调用函数方法的几种方式介绍
Mar 20 Javascript
JS延时器提示框的应用实例代码解析
Apr 27 Javascript
js 获取当前web应用的上下文路径实现方法
Aug 19 Javascript
Bootstrap3 Grid system原理及应用详解
Sep 30 Javascript
JavaScript浮点数及运算精度调整详解
Oct 21 Javascript
canvas实现简易的圆环进度条效果
Feb 28 Javascript
JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题
Jun 30 Javascript
Vue项目使用CDN优化首屏加载问题
Apr 01 Javascript
使用js实现一个简单的滚动条过程解析
Sep 10 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编码规范-php coding standard
2007/03/16 PHP
PHP4和PHP5性能测试和对比 测试代码与环境
2007/08/17 PHP
PHP 飞信好友免费短信API接口开源版
2010/07/22 PHP
不重新编译PHP为php增加openssl模块的方法
2011/06/14 PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
2012/09/13 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
jQuery 学习入门篇附实例代码
2010/03/16 Javascript
js分页工具实例
2015/01/28 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
2015/04/07 Javascript
使用Raygun对Node.js应用进行错误处理的方法
2015/06/23 Javascript
JS判断是否长按某一键的方法
2016/03/02 Javascript
JavaScript 不支持 indexof 该如何解决
2016/03/30 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
2016/08/29 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
JavaScript面向对象核心知识与概念归纳整理
2020/05/09 Javascript
uni-app使用微信小程序云函数的步骤示例
2020/05/22 Javascript
JavaScript中作用域链的概念及用途讲解
2020/08/06 Javascript
使用js获取身份证年龄的示例代码
2020/12/11 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
[05:24]TI9采访——教练
2019/08/24 DOTA
python ElementTree 基本读操作示例
2009/04/09 Python
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
2014/07/11 Python
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
Python 实现链表实例代码
2017/04/07 Python
python操作excel的方法
2018/08/16 Python
在pandas多重索引multiIndex中选定指定索引的行方法
2018/11/16 Python
Python学习笔记之字符串和字符串方法实例详解
2019/08/22 Python
Pandas将列表(List)转换为数据框(Dataframe)
2020/04/24 Python
Django DRF认证组件流程实现原理详解
2020/08/17 Python
html5中如何将图片的绝对路径转换成文件对象
2018/01/11 HTML / CSS
Lowe’s加拿大:家居装修、翻新和五金店
2019/12/06 全球购物
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
普通党员自我剖析材料
2014/10/07 职场文书