搭建mock服务器(微信小程序)
搭建mock服务器(微信小程序)
如何在微信小程序使用mock.js实在是个问题,为了完全模拟访问路由和数据,选择在搭建本地mock服务器是一个不错的选择。
以下示例了一个mock服务器的搭建过程以及以学生为对象进行增删改查分页的示例。
前提要求
安装了node.js
创建服务器
- 我们在自己电脑上选择一个位置,创建一个新的文件夹mockServer,用vscode打开这个文件夹
- 使用命令安装以下模块
cnpm install express body-parser cors nodemon mockjs --save
- express node.js框架
- body-parser 用于解析url
- cors 用来解决跨域问题
- nodemon 解决代码改变需要自己手动重启服务器的问题,nodemon检测到代码改变会自己启动服务器
- mockjs mock模拟工具
- 建立文件和目录
(1)使用npm init -f
生成一个package.json
文件
修改为使用 nodemon 启动
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon server.js"
},
(2)创建server.js文件,mock目录
- 在
server.js
中写入以下代码用于测试,在控制条输入npm start
启动服务器
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cors());
app.get('/posts', (req, res) => {
res.send([
{
title: 'Hello World!',
description: 'Hi there! How are you?'
}
]);
});
// 指定端口
const PORT = 8081;
app.listen(PORT, () => {
console.log(`服务器启动,运行为http://localhost:${PORT}`);
});
控制台将会输出服务器启动,运行为http://localhost:8081
;我们在浏览器中访问http://localhost:8081/posts
,出现以下内容,那么说明服务器创建成功。
[
{
"title": "Hello World!",
"description": "Hi there! How are you?"
}
]
创建mock接口
- 在mock文件夹下新建2个文件,一个
index.js
用于声明路由,一个student.js
,用来编写模拟学生对象相关操作代码。 - 在student.js编写相关操作代码
// student.js
const Mock = require('mockjs');
let list = [];
const count = 100;
for (let i = 0; i < count; i++) {
list.push(
Mock.mock({
id: '@increment',
stuNo: 20220000 + parseInt(`${i + 1}`),
stuName: '@cname',
stuGender: '@integer(0,1)',
stuPhone: /^1[0-9]{10}$/,
stuBirthday: '@date("yyyy-MM-dd")',
classNo: '@integer(201901,201912)'
})
);
}
// 增加学生
exports.add = (req, res) => {
const { classNo, stuBirthday, stuGender, stuName, stuPhone } = req.body;
list.push({
id: list[list.length - 1].id + 1,
stuNo: list[list.length - 1].stuNo + 1,
classNo: classNo,
stuBirthday: stuBirthday,
stuGender: stuGender,
stuName: stuName,
stuPhone: stuPhone
});
let msg = {
code: 20000,
data: {
listNum: list.length,
message: '添加成功!'
}
};
res.status(200).json(msg);
};
// 删除学生
exports.delete = (req, res) => {
const id = req.params.id;
// 判断id是否存在
let flag = list.some(item => {
if (item.id == id) {
return true;
}
});
if (flag) {
// id 存在
list = list.filter(item => item.id !== parseInt(id));
const msg = {
code: 20000,
data: {
listNum: list.length,
message: '删除成功!'
}
};
res.status(200).json(msg);
} else {
// id不存在
const msg = {
code: 40000,
data: {
msg: 'id不存在!'
}
};
res.status(500).json(msg);
}
};
// 更新学生信息
exports.update = (req, res) => {
const { id, classNo, stuBirthday, stuGender, stuName, stuPhone } = req.body;
// 判断id是否存在
let flag = list.some(item => {
if (item.id == id) {
return true;
}
});
if (flag) {
// id存在
list.some(item => {
if (item.id === id) {
item.classNo = classNo;
item.stuBirthday = stuBirthday;
item.stuGender = stuGender;
item.stuName = stuName;
item.stuPhone = stuPhone;
}
});
let msg = {
code: 20000,
data: {
message: '更新成功!'
}
};
res.status(200).json(msg);
} else {
// id不存在
const msg = {
code: 40000,
data: {
msg: 'id不存在!'
}
};
res.status(500).json(msg);
}
};
// 查询学生信息
exports.find = (req, res) => {
let { queryStr, page = 1, limit = 10 } = req.body;
// 根据学生姓名查询学生或者返回所有学生信息
const mockList = queryStr && queryStr.length > 0 ? list.filter(item => item.stuName.includes(queryStr)) : list;
// 数据分页
const pageList = mockList.filter((item, index) => index < limit * page && index >= limit * (page - 1));
let msg = {
code: 20000,
count: mockList.length,
data: pageList
};
res.status(200).json(msg);
};
// 根据id返回学生信息
exports.findById = (req, res) => {
const id = req.query.id;
const pageList = list.filter(item => item.id == id);
const msg = {
code: 20000,
data: pageList
};
res.status(200).json(msg);
};
- 定义路由
// index.js
module.exports = function(app) {
const student = require('./student');
// 新增学生
app.post('/student/add', student.add);
// 删除学生
app.delete('/student/delete/:id', student.delete);
// 更新学生信息
app.put('/student/update', student.update);
// 查询学生信息
app.post('/student/list', student.find);
// 查询单个学生接口
app.get('/student', student.findById);
};
- 在
server.js
中引入index.js
文件,删除定义的posts接口
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cors());
// 引入路由文件
require('./mock/index')(app);
// 指定端口
const PORT = 8081;
app.listen(PORT, () => {
console.log(`服务器启动,运行为http://localhost:${PORT}`);
});
测试接口
以下为在小程序中编写的测试代码
<!--index.wxml-->
<view class="container">
<button catchtap='getStudent'>获取学生信息</button>
<button catchtap='deleteStudent'>删除学生信息</button>
<button catchtap='addStudent'>新增学生信息</button>
<button catchtap='updateStudent'>更新学生信息</button>
<button catchtap='findStudent'>查询单个学生</button>
</view>
//index.js
//获取应用实例
const app = getApp()
Page({
data: {},
getStudent:function(){
wx.request({
url: 'http://localhost:8081/student/list',
data:{
queryStr:'',
page:1,
limit:10
},
method: 'POST',
success: function (res) {
console.log('访问成功:', res);
},
fail: function (e) {
console.log('访问失败:', e);
},
complete: function () {
console.log('访问完成');
}
})
},
deleteStudent:function(){
wx.request({
url: 'http://localhost:8081/student/delete/1',
method: 'DELETE',
success: function (res) {
console.log('访问成功:', res);
},
fail: function (e) {
console.log('访问失败:', e);
},
complete: function () {
console.log('访问完成');
}
})
},
addStudent:function(){
wx.request({
url: 'http://localhost:8081/student/add',
data:{
classNo:'201901',
stuBirthday:'2019-05-31',
stuGender:0,
stuName:'李小珍',
stuPhone:'12345678910'
},
method: 'POST',
success: function (res) {
console.log('访问成功:', res);
},
fail: function (e) {
console.log('访问失败:', e);
},
complete: function () {
console.log('访问完成');
}
})
},
updateStudent:function(){
wx.request({
url: 'http://localhost:8081/student/update',
data: {
id:1,
classNo: '201901',
stuBirthday: '2019-05-31',
stuGender: 0,
stuName: '李小珍',
stuPhone: '12345678910'
},
method: 'PUT',
success: function (res) {
console.log('访问成功:', res);
},
fail: function (e) {
console.log('访问失败:', e);
},
complete: function () {
console.log('访问完成');
}
})
},
findStudent:function(){
wx.request({
url: 'http://localhost:8081/student?id=2',
data: {},
method: 'GET',
success: function (res) {
console.log('访问成功:', res);
},
fail: function (e) {
console.log('访问失败:', e);
},
complete: function () {
console.log('访问完成');
}
})
}
})
返回的结果如下:
- 获取学生信息
- 删除学生信息
3.新增学生信息
- 更新学生信息
PS:因为前面id被删除了,所以这个时候更新会报错
- 根据id查询单个学生
2019/05/31 18:56
搭建mock服务器(微信小程序)的更多相关文章
- 直播平台源码搭建教程:微信小程序中的直播如何去掉水印
直播平台源码搭建教程:微信小程序中的直播如何去掉水印 本文与大家分享一下直播平台源码搭建教程,如何去掉直播视频的水印 var services = require('../../lib/service ...
- 使用wordpress搭建的一个微信小程序
- 一个小时快速搭建微信小程序教程
「小程序」这个划时代的产品发布快一周了,互联网技术人都在摩拳擦掌,跃跃欲试.可是小程序目前还在内测,首批只发放了 200 个内测资格(泪流满面).本以为没有 AppID 这个月就与小程序无缘了,庆幸的 ...
- 一个小时快速搭建微信小程序
「小程序」这个划时代的产品发布快一周了,互联网技术人都在摩拳擦掌,跃跃欲试.可是小程序目前还在内测,首批只发放了 200 个内测资格(泪流满面).本以为没有 AppID 这个月就与小程序无缘了,庆幸的 ...
- 微信小程序--图片相关问题合辑
图片上传相关文章 微信小程序多张图片上传功能 微信小程序开发(二)图片上传 微信小程序上传一或多张图片 微信小程序实现选择图片九宫格带预览 ETL:微信小程序之图片上传 微信小程序wx.preview ...
- 微信小程序开发之微信支付
微信支付是小程序开发中很重要的一个环节,下面会结合实战进行分析总结 环境准备 https服务器 微信小程序只支持https请求,因此需要配置https的单向认证服务(请参考 另一篇文章https受信证 ...
- 微慕-专业WordPress微信小程序
2018年9月,微慕小程序(以下简称微慕版)发布以来,一直想写一篇详细详细的说明文字,全面解读这套专业的WordPress小程序.昨天,又上线了一个稳定版本后,我才下决心,也更有信心,写点文字,向你推 ...
- 从session原理出发解决微信小程序的登陆问题
声明:本文为作者原创文章,转载请注明出处 https://www.cnblogs.com/MaMaNongNong/p/9127416.html 原理知识准备 对于已经熟悉了session原理的同 ...
- 微信小程序如何发送短信验证码,无需搭建服务器
自从微信小程序提供云开发支持,开发者无需搭建后台服务器,使用微信提供的核心API就可以实现应用功能,此时就需要小程序能够自己发送短信,比如短信验证码,榛子云短信(http://smsow.zhenzi ...
随机推荐
- 洛谷 P2024 [NOI2001]食物链 (并查集)
嗯... 题目链接:https://www.luogu.org/problemnew/show/P2024 这道题和团伙这道题的思想比较类似,都是一个数组分成几个集合,但这道题的思路更加混乱,建议没做 ...
- 华东交通大学2017年ACM“双基”程序设计竞赛 1003
Problem Description 有两个球在长度为L的直线跑道上运动,两端为墙.0时刻小球a以1m/s的速度从起点向终点运动,t时刻小球b以相同的速度从终点向起点运动.问T时刻两球的距离.这里小 ...
- 关闭异常进程bat格式文件
当电脑反应慢可能时某些进程运行导致,可将进程名称添加至bat文件中,形成脚本,快速关闭 操作方法:新建*.txt文件,将进程名以如下方式,添加至文件中,保存并修改文件名称为“*.bat”,window ...
- Windows下搭建QT环境
必须软件 qt-windows-opensource-5.1.1-msvc2010-x86-offline qt-vs-addin-1.2.2-opensource支持vs2008.2010.2012 ...
- formatter 操作列表的合并
{field:'22',title:'操作',width:250,align:'center',sortable:true,formatter : function(value, row, index ...
- docker~aspnetcore2.0镜像安装软件的加速器
一般对于安装软件加速时,我们大多数会选择阿里云,而对于aspnetcore2.0这个进项来说,由于使用的是Debian操作系统,所有我们要找到它对应的mirror列表,下面是我整理的一个sources ...
- varnish与squid的比较
生产环境中尝试使用varnish替代squid的主要原因: 1. squid不支持多核cpu, 生产环境中大多使用Dell R610系列,这种类型机器配置为2个4核双线程cpu, 操作系统识别为16个 ...
- java字符串与二进制的相互转化
public class StrBinaryTurn { // 将Unicode字符串转换成bool型数组 public boolean[] StrToBool(String input) { boo ...
- oracle存储过程jdbc调用
package com.jckb.procedure; import java.sql.CallableStatement; import java.sql.Connection; import ja ...
- 生产消费者模式与python+redis实例运用(基础篇)
根据这个图,我们举个简单的例子:假如你去某个餐厅吃饭,点了很多菜,厨师要一个一个菜的做,一个厨师不可能同时做出所有你点的菜,于是你有两个选择:第一个,厨师把所有菜都上齐了,你才开始吃:还有一个选择,做 ...