微信小程序+nodeJs+express+mongodb踩坑记录 1、后台搭建

一、创建项目

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;

青浅个人博客

欢迎评论、点赞、留言

下一篇:微信小程序+nodeJs+express+mongodb踩坑记录 2、封装公共的增删改查方法

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值