jQuery+koa2实现简单的Ajax请求的示例


Posted in jQuery onMarch 06, 2018

前言

之前写Ajax代码只管前端的实现,感觉这样导致自己对Ajax的请求的理解不够深入,所以写了这个从前端到后端的Ajax实现小demo,分别实现简单的GETPOST请求,加深下对前后端交互的理解。

技术栈

  1. koa2
  2. jQuer

需求

某些逻辑可以直接在前端处理,这里发给后端处理是为了更好地理解Ajax请求。

POST

通过填写编号和姓名并发送POST请求来保存人员信息,当信息未填写或填写不正确时给出格式错误的提醒;当信息填写正确但编号已存在时给出编号已存在的提醒;当信息填写正确且编号不存在时显示保存成功。

GET

通过填写编号并发送GET请求来查询人员信息,当编号未填写或填写不正确时给出格式错误的提醒;当编号填写正确且编号已存在时返回人员信息;当信息填写正确但编号不存在时显示人员不存在的错误提醒。

文件列表

  1. dist
    1. index.html
    2. index.js
  2. server.js
  3. router.js

前端实现

html页面

index.html,简单的html页面,通过点击按钮发送json格式的Ajax请求:

<!DOCTYPE html>
<html>
<head>
 <meta charset="UTF-8">
 <title>Document</title>
 <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
</head>
<body>
 <div>
 <h1>Hello World</h1>
 <label for="person-number">编号</label>
 <input type="text" id="person-number">
 <label for="person-name">姓名</label>
 <input type="text" id="person-name">
 <button id="save">保存信息</button>
 <label for="search-number">编号</label>
 <input type="text" id="search-number">
 <button id="search">查询信息</button>
 <br>
 <br>
 <div id="message"></div>
 </div>
 <!-- jQuery实现代码 -->
 <script src="./index.js"><script>
</body>
</html>

jQuery发送Ajax请求

发送GET请求:

var searchButton = $('#search');
var personNumber = $('#person-number').val();
searchButton.click(() => {
 var number = $('#search-number').val();
 $.ajax({
 type: 'GET',
 url: `person/?number=${number}`
 })
});

发送POST请求:

var saveButton = $('#save').click(() => {
 var number = $('#person-number').val();
 var name = $('#person-name').val();
 $.ajax({
 type: 'POST',
 url: 'person',
 dataType: 'json',
 data: {
  number: number,
  name: name
 }
 })
});

处理返回的json数据

通过ajaxComplete事件处理返回的数据,这个事件只能绑定到document对象上:

// Ajax完成事件
$(document).ajaxComplete(function(event, xhr, settings) {
 var obj = JSON.parse(xhr.responseText);
 var data = obj.data;
 if(obj.success && data['number']){
 $('#message').text(`姓名:${data['name']} 编号:${data['number']}`);
 } else {
 $('#message').text(data);
 }
});

后端实现

web服务器

通过koa2来实现一个简单的Web服务器。server.js

const path = require('path');
const serve = require('koa-static');
const Koa = require('koa');
const koaBody = require('koa-body'); // 解析 multipart、urlencoded和json格式的请求体
const router = require('./router.js');

const app = new Koa();

app.use(serve(path.join(__dirname, './dist'))); // 读取前端静态页面
app.use(koaBody()); // 通过该中间件解析POST请求的请求体才能拿到数据
app.use(router.routes());
app.listen(3000);

console.log('listening on port 3000');

通过路由处理请求

处理GET请求,并以json字符串的形式返回数据。通过GET请求发送的查询参数会以对象字面量的形式保存在ctx.query属性中:

router.get('/person', (ctx, next) => {
 let number = ctx.query.number;
 let temp = {};
 // 判断编号是否存在
 temp.data = /^[0-9]+$/.test(number) ? (people[number] ? people[number] : '编号不存在' ) : '编号格式错误';
 temp.success = !!temp.data['number'];
 ctx.body = JSON.stringify(temp); // 响应请求,发送处理后的信息给客户端
});

处理POST请求,并以json字符串的形式返回数据。POST请求的数据保存在请求的请求体中,需要用koa-body中间件自动解析后才能通过ctx.request.body获取请求的数据:

router.post('/person', (ctx, next) => {
 let query = ctx.request.body;
 let temp = {};
 // 编号必须是数字并且大于0,名字必须存在
 if (/^[0-9]+$/.test(query.number) && query.name && parseInt(query.number, 10) > 0) {
 // 判断编号是否存在
 if (!people[query.number]) {
  // 保存信息
  people[query.number] = {
  number: parseInt(query.number, 10),
  name: query.name
  };
  temp.success = true;
  temp.data = '保存成功';
 } else {
  temp.success = false;
  temp.data = '编号已存在';
 }
 } else {
 temp.success = false;
 temp.data = '信息格式错误';
 }
 ctx.body = JSON.stringify(temp);
});

完整的router.js:

const Router = require('koa-router');

const router = new Router();

// 初始的人员信息对象,信息从这里储存和读取。
const people = {
 1: { number: 1, name: 'Dan Friedell' },
 2: { number: 2, name: 'Anna Matteo' },
 3: { number: 3, name: 'Susan Shand' },
 4: { number: 4, name: 'Bryan Lynn' },
 5: { number: 5, name: 'Mario Ritter' },
};

router.get('/person', (ctx, next) => {
 let number = ctx.query.number;
 let temp = {}; // 要返回给客户端的对象,通过success属性判断存取是否成功。
 // 判断编号是否存在
 temp.data = /^[0-9]+$/.test(number) ? (people[number] ? people[number] : '编号不存在' ) : '编号格式错误';
 temp.success = !!temp.data['number'];
 ctx.body = JSON.stringify(temp);
});

router.post('/person', (ctx, next) => {
 let query = ctx.request.body;
 let temp = {};
 // 编号必须是数字并且大于0,名字必须存在
 if (/^[0-9]+$/.test(query.number) && query.name && parseInt(query.number, 10) > 0) {
 // 判断编号是否存在
 if (!people[query.number]) {
  // 保存信息
  people[query.number] = {
  number: parseInt(query.number, 10),
  name: query.name
  };
  temp.success = true;
  temp.data = '保存成功';
 } else {
  temp.success = false;
  temp.data = '编号已存在';
 }
 } else {
 temp.success = false;
 temp.data = '信息格式错误';
 }
 ctx.body = JSON.stringify(temp);
});


module.exports = router;

测试

在控制台输入node server.js可以看到服务器在3000端口运行了,打开浏览器输入localhost:3000就可以看到一个简单的前端页面:

jQuery+koa2实现简单的Ajax请求的示例

查询数据:

jQuery+koa2实现简单的Ajax请求的示例

jQuery+koa2实现简单的Ajax请求的示例

保存数据:

jQuery+koa2实现简单的Ajax请求的示例

再次查询数据:

jQuery+koa2实现简单的Ajax请求的示例

至此,一个完整的Ajax请求demo就完成了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

jQuery 相关文章推荐
jQuery实现锚点向下平滑滚动特效示例
Aug 29 jQuery
jQuery实现的表格前端排序功能示例
Sep 18 jQuery
jQuery插件artDialog.js使用与关闭方法示例
Oct 09 jQuery
使用jQuery 操作table 完成单元格合并的实例
Dec 27 jQuery
jQuery实现的简单获取索引功能示例
Jun 04 jQuery
jQuery实现为动态添加的元素绑定事件实例分析
Sep 07 jQuery
jQuery简单实现根据日期计算星期几的方法
Jan 09 jQuery
JQuery判断radio单选框是否选中并获取值的方法
Jan 17 jQuery
jQuery选择器之层次选择器用法实例分析
Feb 19 jQuery
详解jQuery-each()方法
Mar 13 jQuery
JQuery表单元素取值赋值方法总结
May 12 jQuery
如何使用jQuery操作Cookies方法解析
Sep 08 jQuery
轻松搞定jQuery+JSONP跨域请求的解决方案
Mar 06 #jQuery
jQuery实现左右滑动的toggle方法
Mar 03 #jQuery
jquery radio 动态控制选中失效问题的解决方法
Feb 28 #jQuery
详解jQuery中的isPlainObject()使用方法
Feb 27 #jQuery
jQuery幻灯片插件owlcarousel参数说明中文文档
Feb 27 #jQuery
jQuery实现碰到边缘反弹的动画效果
Feb 24 #jQuery
jQuery 改变P标签文本值方法
Feb 24 #jQuery
You might like
Session保存到数据库的php类分享
2011/10/24 PHP
基于PHP Socket配置以及实例的详细介绍
2013/06/13 PHP
php的hash算法介绍
2014/02/13 PHP
PHP实现生成唯一编号(36进制的不重复编号)
2014/07/01 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
javascript获得CheckBoxList选中的数量
2009/10/27 Javascript
js下利用控制器载入对应脚本
2010/07/17 Javascript
在Javascript里访问SharePoint列表数据的实现方法
2011/05/22 Javascript
Bootstrap字体图标无法正常显示的解决方法
2016/10/08 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
ES6新特性一: let和const命令详解
2017/04/20 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
2017/05/20 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
axios取消请求的实践记录分享
2018/09/26 Javascript
浅谈webpack性能榨汁机(打包速度优化)
2019/01/09 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2019/07/15 Javascript
node.js中fs文件系统模块的使用方法实例详解
2020/02/13 Javascript
OpenLayers3实现对地图的基本操作
2020/09/28 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
[01:07:15]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第二场 1月25日
2021/03/11 DOTA
Python在Windows和在Linux下调用动态链接库的教程
2015/08/18 Python
pytorch之添加BN的实现
2020/01/06 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
2020/10/14 Python
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
HTML5获取当前地理位置并在百度地图上展示的实例
2020/07/10 HTML / CSS
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
德国狗狗用品在线商店:Schecker
2017/03/17 全球购物
英国计算机产品零售商:Novatech(定制个人电脑、笔记本电脑、工作站和服务器)
2018/01/28 全球购物
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
LVMH旗下最大的奢侈品网站平台:24S
2020/05/24 全球购物
大学生护理专业自荐信
2013/10/03 职场文书
研究生导师评语
2014/12/31 职场文书
企业安全隐患排查治理制度
2015/08/05 职场文书
python面向对象版学生信息管理系统
2021/06/24 Python
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python