搭建mock服务器(微信小程序)

如何在微信小程序使用mock.js实在是个问题,为了完全模拟访问路由和数据,选择在搭建本地mock服务器是一个不错的选择。

以下示例了一个mock服务器的搭建过程以及以学生为对象进行增删改查分页的示例。

前提要求

安装了node.js

创建服务器

  1. 我们在自己电脑上选择一个位置,创建一个新的文件夹mockServer,用vscode打开这个文件夹
  2. 使用命令安装以下模块
cnpm install express body-parser cors nodemon mockjs --save
  • express node.js框架
  • body-parser 用于解析url
  • cors 用来解决跨域问题
  • nodemon 解决代码改变需要自己手动重启服务器的问题,nodemon检测到代码改变会自己启动服务器
  • mockjs mock模拟工具
  1. 建立文件和目录

(1)使用npm init -f生成一个package.json文件

​ 修改为使用 nodemon 启动

"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon server.js"
},

(2)创建server.js文件,mock目录

  1. 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接口

  1. 在mock文件夹下新建2个文件,一个index.js用于声明路由,一个student.js,用来编写模拟学生对象相关操作代码。
  2. 在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);
};
  1. 定义路由
//	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);
};
  1. 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('访问完成');
}
})
}
})

返回的结果如下:

  1. 获取学生信息

  1. 删除学生信息

3.新增学生信息

  1. 更新学生信息

PS:因为前面id被删除了,所以这个时候更新会报错

  1. 根据id查询单个学生

2019/05/31 18:56

搭建mock服务器(微信小程序)的更多相关文章

  1. 直播平台源码搭建教程:微信小程序中的直播如何去掉水印

    直播平台源码搭建教程:微信小程序中的直播如何去掉水印 本文与大家分享一下直播平台源码搭建教程,如何去掉直播视频的水印 var services = require('../../lib/service ...

  2. 使用wordpress搭建的一个微信小程序

  3. 一个小时快速搭建微信小程序教程

    「小程序」这个划时代的产品发布快一周了,互联网技术人都在摩拳擦掌,跃跃欲试.可是小程序目前还在内测,首批只发放了 200 个内测资格(泪流满面).本以为没有 AppID 这个月就与小程序无缘了,庆幸的 ...

  4. 一个小时快速搭建微信小程序

    「小程序」这个划时代的产品发布快一周了,互联网技术人都在摩拳擦掌,跃跃欲试.可是小程序目前还在内测,首批只发放了 200 个内测资格(泪流满面).本以为没有 AppID 这个月就与小程序无缘了,庆幸的 ...

  5. 微信小程序--图片相关问题合辑

    图片上传相关文章 微信小程序多张图片上传功能 微信小程序开发(二)图片上传 微信小程序上传一或多张图片 微信小程序实现选择图片九宫格带预览 ETL:微信小程序之图片上传 微信小程序wx.preview ...

  6. 微信小程序开发之微信支付

    微信支付是小程序开发中很重要的一个环节,下面会结合实战进行分析总结 环境准备 https服务器 微信小程序只支持https请求,因此需要配置https的单向认证服务(请参考 另一篇文章https受信证 ...

  7. 微慕-专业WordPress微信小程序

    2018年9月,微慕小程序(以下简称微慕版)发布以来,一直想写一篇详细详细的说明文字,全面解读这套专业的WordPress小程序.昨天,又上线了一个稳定版本后,我才下决心,也更有信心,写点文字,向你推 ...

  8. 从session原理出发解决微信小程序的登陆问题

    声明:本文为作者原创文章,转载请注明出处 https://www.cnblogs.com/MaMaNongNong/p/9127416.html  原理知识准备  对于已经熟悉了session原理的同 ...

  9. 微信小程序如何发送短信验证码,无需搭建服务器

    自从微信小程序提供云开发支持,开发者无需搭建后台服务器,使用微信提供的核心API就可以实现应用功能,此时就需要小程序能够自己发送短信,比如短信验证码,榛子云短信(http://smsow.zhenzi ...

随机推荐

  1. 总结工作中用到的ES6语法,方便工作中查看,也总结一下经验

    1.模板字符串: 表现形式:${} 举例子: import axios from 'axios'; let base = 'https://www.baidu.com/home/msg/data/pe ...

  2. Problem Statement

    题目链接:https://vjudge.net/contest/239445#problem/E     E - Problem Statement You are given nn strings ...

  3. UVALive 7511 L - Multiplication Table 数学模拟题,暴力

    给定一副表,问其是否合法. 思路:当全部是?的时候,是合法的. 如果不是,那么,就找到一个数字,把它拆成若干个a*b的形式,去判断其它点是否合法即可. 拆分数字的时候,只需要枚举到sqrt(n),因为 ...

  4. java多线程基础(二)--java多线程的基本使用

    java多线程的基本使用 在java中使用多线程,是通过继承Thread这个类或者实现Runnable这个接口或者实现Callable接口来完成多线程的. 下面是很简单的例子代码: package c ...

  5. docker exit status 255解决

    一 windows开发整docker就是痛苦,在公司win7电脑想拿起几年没再用的docker 结果直接报错 Error getting IP address: ssh command error: ...

  6. <linux下内置命令和外部命令>

    Linux下内置命令和外部命令 1.linux的命令可以分为内部命令和外部命令: 内部命令在系统启动时就调入内存,是常驻内存的,所以执行效率高. 而外部命令是系统的软件功能,用户需要时才从硬盘中读入内 ...

  7. 解决pyhton aiohttp ssl:None [[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)

    解决pyhton aiohttp ssl:证书报错问题, 错误信息> Cannot connect to host oapi.dingtalk.com:443 ssl:None [[SSL: C ...

  8. asp.net 在IIS上配置出现的一些问题

    1.可能会遇到一下图的错无.请求的内容似乎是脚本.因而将无法由静态文件处理程序来处理---大概的原因是应用程序池选择错误了.如第二幅图如此解决即可 解决方案如下两个图所示. 我遇到了以上的问题之后能也 ...

  9. 关于IE和Firefox兼容性问题及解决办法

    1.//window.eventIE:有window.event对象FF:没有window.event对象.可以通过给函数的参数传递event对象.如onmousemove=doMouseMove(e ...

  10. Hadoop 分片、分组与排序

    首先需要明确的是,hadoop里的key一定要是可排序的,要么key自身实现了WritableComparator接口,要么有一个排序类可以对key进行排序.如果key本身不实现WritableCom ...