Vue+Express+MongoDB全栈开发流程,以及通用接口封装。

#写再前面#

年纪大了,事情多了,脑袋也靠不住了,不常用的,容易忘记的还是用文字记下来比较好。
本文项目地址:https://github.com/zmannnnn/server-app | 【github地址 】

一,创建express项目

1,全局安装express框架

 npm install express --save

2,选择文件夹创建express项目

在文件夹下运行创建一个叫my-app的项目以及文件夹。

express my-app  // my-app 为项目名称
创建express项目.png

3,运行项目

按照截图里面的1,2,3步运行项目。

cd my-app // 进入项目文件夹
npm install // 初始化项目
npm start // 默认的运行命令是npm start,后面可以进入项目文件 package.json修改
项目目录.jpg

然后在浏览器输入(默认路由地址:http://localhost:3000/项目创建完成

express项目创建.jpg

二,安装本地mongoDB数据库

这个自行安装
地址:mongoDB数据库下载地址
这里推荐一个mongoDB数据库可视化工具 《Studio 3T》

mongodb数据库.jpg

三,express链接数据库

项目下面创建 db.js 文件,用来链接数据库。(当然文件也可以放在其他的文件夹下面,譬如plugins/db.js)

// db.js
module.exports = app => {
  const mongoose = require("mongoose")
  mongoose.connect('mongodb://127.0.0.1:27017/my-app', {
    useNewUrlParser: true, 
    useUnifiedTopology: true // 新版的数据库报错的话,加一个这个属性
  }, err => {
    if(err) console.warn('数据库连接失败!' + err)
    else console.log('数据库链接成功!')
    }
  )
}

全局安装一个自动重启的node工具 nodemon(这个工具是为了修改项目以后自动重新,node和其他的不一样,不会自动重启,有了这个插件就可以了。)

npm install -g nodemon

配置启动文建

image.png

项目里面安装 mongoose(用来链接数据库)和cors(用来跨域) 两个中间件

npm i mongoose cors

项目里面的 app.js 引入

// app.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var app = express();

// 加载链接数据库文件
require('./db.js')(app)

// 加载跨域中间件
app.use(require('cors')())

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
// 这个是设置静态文件夹
app.use(express.static(path.join(__dirname, 'public')));

// 引入自定义路由文件 我这里是为了示例用的temp.js,没有直接用index
require('./routes/temp')(app)

// 这个是连两个默认的路由不要就去掉
/**
 * app.use('/', require('./routes/index'));
 * app.use('/users', require('./routes/users'));
*/

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;


设置路由文件,也就是定义接口 ,在routes里面创建一个temp.js,(名字我随便取得,在app.js应用就好了)

这里我直接定义了一个通用的增删改查的通用路由,通过前端访问 .../api/rest/数据模型文件名/postList(getList,editList,deleteList),就可以把要访问的数据模型直接带给后台,然后自己去访问后台自己想要的数据模型。

// routes > temp.js
/**
 * 创建通用的增删改查的接口模型
*/
module.exports = app => {
  // 引入 express 并把父子路由合并
  const express = require('express')
  const router = express.Router({
    mergeParams: true
  })
  /*======================== 定义接口以及方法 start ========================*/
  let result = {
    code: 200,
    msg: "请求成功"
  }
  // 创建数据
  router.post('/postList', (req, res) => {
    req.ModelData.create(req.body)
    res.json({...result})
  })
  // 获取数据
  router.get('/getList', async (req, res) => {
      const model = await req.ModelData.find().limit()
      res.json({...result, data: model})
  })
  // 修改数据
  router.post('/editList', async (req, res) => {
      // 通过传过来的body里面的数据的_id去数据库里面匹配
    const model = await req.ModelData.findByIdAndUpdate(req.body._id, req.body)
    res.json({...result, data: model})
  })
  // 删除数据
  router.post('/deleteList', (req, res) => {
    req.ModelData.findByIdAndDelete(req.body._id, req.body)
    res.json({...result})
  })
  /*======================== 定义接口以及方法 end ========================*/
  /**
    * 获取数据模型并路由挂载管理
    * 这个写法是一种动态写法,通过前台接口请求传入的参数动态引入模型文件 
    * 譬如前端请求 ".../api/rest/listData/getList" 把文件名listData直接带过连请求不同的文件(即接口数据模型)
    * 如果名称需要类型名称转换的化可以用下面的这个方法进行转换。
    * require('inflection').classify(req.params.resource)
  */
    const resourceMiddleWare = async (req, res, next) => {
        req.ModelData = await require(`../models/${req.params.resource}`) // 给请求绑定原型的名称并引入数据库原型,
        next()
    } // 这个叫中间件,所有的中间件其实可以写在另外的文件里面,放在一起。
  app.use('/api/rest/:resource', resourceMiddleWare, router)
}

创建一个数据库模型

也就是创建一个数据库的表,用来存数据,设置数据的一些字段等。
创建一个models的文件建立一个listData.js的文件(到时候直接通过路由接口也就是temp.js直接操作这个数据模型,用来操作数据库。)

/**  
 * models -> listData.js  
 * 这里我直接把数据模型名称写成了文件名,方便索引。
 * 数据库的字段分别设置了, title / name / content / icon,另外因为mongoDB数据库自带了_id,_v字段,我去掉了_v这个版本字段的显示。
*/
const mongoose = require('mongoose')

const schema = new mongoose.Schema({
  title: { type: String },
  name: { type: String },
  content: { type: String },
  icon: { type: String }
},{ versionKey: false })
// versionKey 不显示版本字段

module.exports = mongoose.model('listData', schema)

WX20210412-103909@2x.png

然后我们请求一下

直接通过链接带的listData请求listData.js这个文件里面的listData这个数据模型。


image.png

请求成功2.jpg

至此,我们的后台通用接口就定义完成了。

如果需要文件上传,token验证等可以看一下本人的另外一个马甲源码地址
https://gitee.com/lovezengcheng/node-admin | 【gitee地址 】

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容