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 相关文章推荐
JS连接SQL数据库与ACCESS数据库的方法实例
Nov 21 Javascript
写出高效jquery代码的19条指南
Mar 19 Javascript
JavaScript中property和attribute的区别详细介绍
Mar 03 Javascript
在Node.js中使用HTTP上传文件的方法
Jun 23 Javascript
简介BootStrap model弹出框的使用
Apr 27 Javascript
JS控制HTML元素的显示和隐藏的两种方法
Sep 27 Javascript
angular分页指令操作
Jan 09 Javascript
用node和express连接mysql实现登录注册的实现代码
Jul 05 Javascript
jQuery实现动态显示select下拉列表数据的方法
Feb 05 jQuery
关于vue中watch检测到不到对象属性的变化的解决方法
Feb 08 Javascript
js中值引用和地址引用实例分析
Jun 21 Javascript
jQuery开发仿QQ版音乐播放器
Jul 10 jQuery
如何利用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用正则表达式匹配中文实例详解
2013/11/06 PHP
ThinkPHP模板判断输出Defined标签用法详解
2014/06/30 PHP
php支付宝APP支付功能
2020/07/29 PHP
jQuery 下拉列表 二级联动插件分享
2012/03/29 Javascript
js改变img标签的src属性在IE下没反应的解决方法
2013/07/23 Javascript
用js代码改变单选框选中状态的简单实例
2013/12/18 Javascript
Node.js文件操作详解
2014/08/16 Javascript
图解JavaScript中的this关键字
2020/05/28 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
JavaScript事件学习小结(一)事件流
2016/06/09 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
详解js运算符单竖杠“|”与“||”的用法和作用介绍
2016/11/04 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
socket.io学习教程之基础介绍(一)
2017/04/29 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
2018/06/25 Javascript
jQuery阻止事件冒泡实例分析
2018/07/03 jQuery
Bootstrap-table自定义可编辑每页显示记录数
2018/09/07 Javascript
js控制随机数生成概率代码实例
2019/03/21 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
微信小程序使用 vant Dialog组件的正确方式
2020/02/21 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
[47:53]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#2COL VS Spirit
2016/03/02 DOTA
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
Python socket实现的简单通信功能示例
2018/08/21 Python
Python 输入一个数字判断成绩分数等级的方法
2018/11/15 Python
python各层级目录下import方法代码实例
2020/01/20 Python
Python之qq自动发消息的示例代码
2021/02/18 Python
中间件分为哪几类
2016/09/18 面试题
大专毕业生简历的自我评价
2013/10/20 职场文书
高中毕业生自我鉴定
2013/11/03 职场文书
毕业纪念册寄语大全
2015/02/26 职场文书
2015年简历自我评价范文
2015/03/11 职场文书
黑白记忆观后感
2015/06/18 职场文书
使用Navicat Premium工具将oracle数据库迁移到MySQL
2021/05/27 Oracle
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers