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 相关文章推荐
破除网页鼠标右键被禁用的绝招大全
Dec 27 Javascript
帮助避免错误的Javascript陷阱清单
May 31 Javascript
JS 对象属性相关(检查属性、枚举属性等)
Apr 05 Javascript
JavaScript函数柯里化详解
Apr 29 Javascript
基于javascript实现按圆形排列DIV元素(三)
Dec 02 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
Dec 08 Javascript
微信小程序 radio单选框组件详解及实例代码
Jan 10 Javascript
JS实现读取xml内容并输出到div中的方法示例
Apr 19 Javascript
JS实现Cookie读、写、删除操作工具类示例
Aug 28 Javascript
webpack之引入图片的实现及问题
Oct 08 Javascript
关于vue项目中搜索节流的实现代码
Sep 17 Javascript
JavaScript indexOf()原理及使用方法详解
Jul 09 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
ThinkPHP多语言支持与多模板支持概述
2014/08/22 PHP
基于JQuery的cookie插件
2010/04/07 Javascript
innerHTML 和 getElementsByName 在IE下面的bug 的解决
2010/04/09 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
js跨域请求的5中解决方式
2015/07/02 Javascript
jquery ajax局部加载方法详解(实现代码)
2016/05/12 Javascript
js控住DOM实现发布微博效果
2016/08/30 Javascript
BootStrap网页中代码显示用法详解
2016/10/21 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
微信小程序scroll-view实现字幕滚动
2018/07/14 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
vue基于element-ui的三级CheckBox复选框功能的实现代码
2018/10/15 Javascript
Vuex mutitons和actions初使用详解
2019/03/04 Javascript
javascript获取元素的计算样式
2019/05/24 Javascript
Vue+Element-UI实现上传图片并压缩
2019/11/26 Javascript
小程序新版订阅消息模板消息
2019/12/31 Javascript
创建nuxt.js项目流程图解
2020/03/13 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
2020/04/26 Javascript
[01:18:33]Secret vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python数据结构之Array用法实例
2014/10/09 Python
Scrapy爬虫实例讲解_校花网
2017/10/23 Python
python 实现在txt指定行追加文本的方法
2018/04/29 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
python使用pandas处理大数据节省内存技巧(推荐)
2019/05/05 Python
Python迭代器iterator生成器generator使用解析
2019/10/24 Python
华为旗下电子商务平台:华为商城
2016/08/06 全球购物
美国演唱会订票网站:Ticketmaster美国
2017/10/05 全球购物
台湾演唱会订票网站:StubHub台湾
2019/06/11 全球购物
Skyscanner香港:机票比价, 平机票和廉价航空机票预订
2020/02/07 全球购物
触摸春天教学反思
2014/02/03 职场文书
管理学院毕业生自荐信范文
2014/03/10 职场文书
超市活动计划书
2014/04/24 职场文书
少先队辅导员事迹材料
2014/12/24 职场文书
pandas数值排序的实现实例
2021/07/25 Python
详解Android中的TimePickerView(时间选择器)的用法
2022/04/30 Java/Android