搭建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 ...
随机推荐
- 无法访问http,会强制跳到https
1. Close Safari. 2. Delete the ~/Library/Cookies/HSTS.plist file. 3. Reopen Safari.
- python大战机器学习——模型评估、选择与验证
1.损失函数和风险函数 (1)损失函数:常见的有 0-1损失函数 绝对损失函数 平方损失函数 对数损失函数 (2)风险函数:损失函数的期望 经验风险:模型在数据集T上的平均损失 根据大 ...
- Spark (Python版) 零基础学习笔记(二)—— Spark Transformations总结及举例
1. map(func) 将func函数作用到数据集的每个元素,生成一个新的分布式的数据集并返回 >>> a = sc.parallelize(('a', 'b', 'c')) &g ...
- 【ACM】孪生素数问题
孪生素数问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 写一个程序,找出给出素数范围内的所有孪生素数的组数.一般来说,孪生素数就是指两个素数距离为2,近的不能再 ...
- 使用tortoise git将一个现有项目推送到远程仓库
一.安装文件: 1.git https://git-scm.com/downloads 2.tortoise git https://tortoisegit.org/download/ 二.将一个现有 ...
- logAB = logA + logB; A,B>0
令 X = logA, Y = logB, Z=logAB .2x = A, 2y = B, 2z = AB, 则有 2z = AB = 2x * 2y = 2x+y ,有z = x+y,即 logA ...
- Java编程中中文乱码问题的研究及解决方案
0 引言 Java最大的特性是与平台的无关性及开发环境的多样性.字符串被Java应用程序转化之前,是根据操作系统默认的编码方式编码.Java语言内部采用Unicode编码,它是定长双字节编码,即任何符 ...
- 最简实例演示asp.net5中用户认证和授权(1)
asp.net5中,关于用户的认证和授权提供了非常丰富的功能,如果结合ef7的话,可以自动生成相关的数据库表,调用也很方便. 但是,要理解这么一大堆关于认证授权的类,或者想按照自己项目的特定要求对认证 ...
- linux下使用shell脚本批处理命令
1.新建脚本touch first.sh 2.写入命令vi first.sh #!/bin/bash #publish service and api echo "copy file&quo ...
- 使用原生javascript实现瀑布流
简介 瀑布流布局是一种很常见的布局方式,他的主要视觉体验为图片元素等宽不等高,图片元素之间的水平排序参差不齐,而且随着滚动条的滚动,数据会进行异步的加载,这样的布局有两个好处,1-有视觉的冲击力,比较 ...