#写再前面#
年纪大了,事情多了,脑袋也靠不住了,不常用的,容易忘记的还是用文字记下来比较好。
本文项目地址:https://github.com/zmannnnn/server-app | 【github地址 】
一,创建express项目
1,全局安装express框架
npm install express --save
2,选择文件夹创建express项目
在文件夹下运行创建一个叫my-app的项目以及文件夹。
express my-app // my-app 为项目名称
3,运行项目
按照截图里面的1,2,3步运行项目。
cd my-app // 进入项目文件夹
npm install // 初始化项目
npm start // 默认的运行命令是npm start,后面可以进入项目文件 package.json修改
然后在浏览器输入(默认路由地址:http://localhost:3000/ )项目创建完成
二,安装本地mongoDB数据库
这个自行安装
地址:mongoDB数据库下载地址
这里推荐一个mongoDB数据库可视化工具 《Studio 3T》
三,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
配置启动文建
项目里面安装 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)
然后我们请求一下
直接通过链接带的listData请求listData.js这个文件里面的listData这个数据模型。
至此,我们的后台通用接口就定义完成了。
如果需要文件上传,token验证等可以看一下本人的另外一个马甲源码地址
https://gitee.com/lovezengcheng/node-admin | 【gitee地址 】