一、创建项目
1、安装依赖文件
express service
cd service
npm install
npm i multer mongoose express-jwt jsonwebtoken body-parser ali-oss co -S
//multer 上传文件
mongoose 操控mongodb
express-jwt token校验中间件
jsonwebtoken token
2、链接数据库
在入口文件 app.js中加入以下代码
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/cakeMongo')
mongoose.connection.on('connected', () => {
console.log('数据库连接成功!');
});
mongoose.connection.on('error', () => {
console.log('数据库连接失败!');
});
mongoose.connection.on('disconnected', () => {
console.log('数据库连接断开!');
})
3、编写公共函数方法和公共参数
新建 utils/config.js 用来保存 微信小程序、阿里云oss 和 系统默认配置参数
const adminPhone = [] // 管理员电话号码
const JWT_SECRET = '' //token 秘钥
const WX_CONFIG = {} //小程序相关参数
const OSS_CONFIG = { //OSS 相关参数
region: 'oss-cn-beijing',
accessKeyId: '',
accessKeySecret: '',
bucket: '',
endPoint: 'oss-cn-beijing.aliyuncs.com',
BucketName: '',
}
const NO_TOKEN = [] //无需进行token校验的接口列表
module.exports = {
adminPhone,
JWT_SECRET,
WX_CONFIG,
OSS_CONFIG,
NO_TOKEN
}
新建 utils/index.js 封装token和时间格式函数
const jwt = require('jsonwebtoken')
const JWT_SECRET = require('./config')
/**
* @name: 创建token
* @param {object} params: 登录后用户信息
* @Author: luoyong/471826078@qq.com
*/
const createToken = (params, strTimes) => {
const token = jwt.sign(params, JWT_SECRET, {
expiresIn: strTimes
})
return token
}
/**
* @name: 校验token
* @param {string} token
* @Author: luoyong/471826078@qq.com
*/
const verToken = function(token) {
return new Promise((resolve, reject) => {
var info = jwt.verify(token, JWT_SECRET);
resolve(info);
})
}
const add0 = (num) => {
return num < 10 ? '0' + num : num
}
/**
* @name: 获取时间戳
* @param {type}
* @Author: luoyong/471826078@qq.com
*/
const getNowDateTimes = () => {
const nowDate = new Date();
return parseInt(nowDate.getTime() / 1000)
}
/**
* @name: 获取当前时间 yyyy-mm-dd HH:MM:SS
* @param {type}
* @Author: luoyong/471826078@qq.com
*/
const formatDate = () => {
const time = new Date();
const year = time.getFullYear()
const month = time.getMonth() + 1
const day = time.getDate()
const h = time.getHours()
const minute = time.getMinutes()
const second = time.getSeconds()
return year + '-' + add0(month) + '-' + add0(day) + ' ' + add0(h) + ':' + add0(minute) + ':' + add0(second)
}
module.exports = {
createToken,
verToken,
getNowDateTimes,
formatDate
}
二、创建mongoose model
mkdir model
cd model
创建 product.js
创建并导出Product model
const mongoose = require('mongoose')
const Schema = mongoose.Schema
const productShcema = new Schema({
})
module.exports = mongoose.model(Product, productShcema)
依次创建 user、cakeCate、cakePrice、cookPrice、save、likes、order、shopCart、comment 并导出
具体结构字段查看:cakeModel.md
三、创建路由(写接口)
在routes文件夹新建product.js,加入如下代码:
const expres = require('express')
const router = expres.Router()
const Product = require('./../model/product')
/**
* @name: 增加商品
* @param {type}
* @Author: luoyong/471826078@qq.com
*/
router.post('/addProduct', (req, res, next) => {
})
/**
* @name: 删除商品
* @param {type}
* @Author: luoyong/471826078@qq.com
*/
router.post('/deleteProduct', (req, res, next) => {
})
/**
* @name: 编辑商品
* @param {type}
* @Author: luoyong/471826078@qq.com
*/
router.post('/editProduct', (req, res, next) => {
})
/**
* @name: 查询商品
* @param {type}
* @Author: luoyong/471826078@qq.com
*/
router.get('/queryProduct', (req, res, next) => {
})
module.exports = router
四、在入口文件app.js中加入,product功能路由
为了方便前端使用跨域代理,routes路径上统一加上 “/api”
//express创建项目默认的路由文件
app.use('/api/', indexRouter);
app.use('/api/users', usersRouter);
//添加功能路由
app.use('/api/product', require('./routes/product'))
// catch 404 and forward to error handler
五、在入口文件app.js中加入token校验中间件
- 这里需要用到上面安装的 express-jwt 插件
const expressJwt = require('express-jwt')
const { verToken } = require('./utils/tokens')
const { JWT_SECRET, NO_TOKEN } = require('./utils/config')
//token校验中间件
app.use((req, res, next) => {
const token = req.headers['authorization'];
if (token == undefined) {
return next()
} else {
verToken(token).then((data) => {
req.data = data
return next()
}).catch((error) => {
return next()
})
}
})
app.use(expressJwt({
secret: JWT_SECRET, // 密匙
algorithms: ['HS256'] //最新的expressJwt @6.0.0版本需要加上这个属性
}).unless({
path: NO_TOKEN //除了这个地址,其他的URL都需要验证
}));
//当token失效返回提示信息
app.use(function(err, req, res, next) {
if (err.status == 401) {
return res.status(401).send('token失效');
}
});
- 特别需要注意的是 第四块中的路由列表需要写在app.use(expressJwt({secret: JWT_SECRET}).unless({path: NO_TOKEN })) 后面,否则所有的接口都将不会被校验
附上完整的app.js代码
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var mongoose = require('mongoose')
var logger = require('morgan');
const expressJwt = require('express-jwt')
const { verToken } = require('./utils/tokens')
const { JWT_SECRET, NO_TOKEN } = require('./utils/config')
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.json({ limit: '50mb' }));
mongoose.connect('mongodb://localhost:27017/cakeMongo', { useNewUrlParser: true, useUnifiedTopology: true })
mongoose.connection.on('connected', () => {
console.log('数据库连接成功!');
});
mongoose.connection.on('error', () => {
console.log('数据库连接失败!');
});
mongoose.connection.on('disconnected', () => {
console.log('数据库连接断开!');
})
//token校验中间件
app.use((req, res, next) => {
const token = req.headers['authorization'];
if (token == undefined) {
return next()
} else {
verToken(token).then((data) => {
req.data = data
return next()
}).catch((error) => {
return next()
})
}
})
app.use(expressJwt({
secret: JWT_SECRET, // 密匙
algorithms: ['HS256']
}).unless({
path: NO_TOKEN //除了这个地址,其他的URL都需要验证
}));
// 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')));
app.use('/api/', indexRouter);
app.use('/api/users', usersRouter);
app.use('/api/product', require('./routes/product'))
//当token失效返回提示信息
app.use(function(err, req, res, next) {
if (err.status == 401) {
return res.status(401).send('token失效');
} else if (err.status == 403) {
return res.status(403).send('请先登录');
}
});
// 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;
欢迎评论、点赞、留言