最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

jQuery+koa2實(shí)現(xiàn)簡(jiǎn)單的Ajax請(qǐng)求的示例

 更新時(shí)間:2018年03月06日 13:43:28   作者:Ned2017  
這篇文章主要介紹了jQuery+koa2實(shí)現(xiàn)簡(jiǎn)單的Ajax請(qǐng)求的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

前言

之前寫(xiě)Ajax代碼只管前端的實(shí)現(xiàn),感覺(jué)這樣導(dǎo)致自己對(duì)Ajax的請(qǐng)求的理解不夠深入,所以寫(xiě)了這個(gè)從前端到后端的Ajax實(shí)現(xiàn)小demo,分別實(shí)現(xiàn)簡(jiǎn)單的GETPOST請(qǐng)求,加深下對(duì)前后端交互的理解。

技術(shù)棧

  1. koa2
  2. jQuer

需求

某些邏輯可以直接在前端處理,這里發(fā)給后端處理是為了更好地理解Ajax請(qǐng)求。

POST

通過(guò)填寫(xiě)編號(hào)和姓名并發(fā)送POST請(qǐng)求來(lái)保存人員信息,當(dāng)信息未填寫(xiě)或填寫(xiě)不正確時(shí)給出格式錯(cuò)誤的提醒;當(dāng)信息填寫(xiě)正確但編號(hào)已存在時(shí)給出編號(hào)已存在的提醒;當(dāng)信息填寫(xiě)正確且編號(hào)不存在時(shí)顯示保存成功。

GET

通過(guò)填寫(xiě)編號(hào)并發(fā)送GET請(qǐng)求來(lái)查詢?nèi)藛T信息,當(dāng)編號(hào)未填寫(xiě)或填寫(xiě)不正確時(shí)給出格式錯(cuò)誤的提醒;當(dāng)編號(hào)填寫(xiě)正確且編號(hào)已存在時(shí)返回人員信息;當(dāng)信息填寫(xiě)正確但編號(hào)不存在時(shí)顯示人員不存在的錯(cuò)誤提醒。

文件列表

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

前端實(shí)現(xiàn)

html頁(yè)面

index.html,簡(jiǎn)單的html頁(yè)面,通過(guò)點(diǎn)擊按鈕發(fā)送json格式的Ajax請(qǐng)求:

<!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">編號(hào)</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">編號(hào)</label>
 <input type="text" id="search-number">
 <button id="search">查詢信息</button>
 <br>
 <br>
 <div id="message"></div>
 </div>
 <!-- jQuery實(shí)現(xiàn)代碼 -->
 <script src="./index.js"><script>
</body>
</html>

jQuery發(fā)送Ajax請(qǐng)求

發(fā)送GET請(qǐng)求:

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

發(fā)送POST請(qǐng)求:

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數(shù)據(jù)

通過(guò)ajaxComplete事件處理返回的數(shù)據(jù),這個(gè)事件只能綁定到document對(duì)象上:

// 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']} 編號(hào):${data['number']}`);
 } else {
 $('#message').text(data);
 }
});

后端實(shí)現(xiàn)

web服務(wù)器

通過(guò)koa2來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Web服務(wù)器。server.js

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

const app = new Koa();

app.use(serve(path.join(__dirname, './dist'))); // 讀取前端靜態(tài)頁(yè)面
app.use(koaBody()); // 通過(guò)該中間件解析POST請(qǐng)求的請(qǐng)求體才能拿到數(shù)據(jù)
app.use(router.routes());
app.listen(3000);

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

通過(guò)路由處理請(qǐng)求

處理GET請(qǐng)求,并以json字符串的形式返回?cái)?shù)據(jù)。通過(guò)GET請(qǐng)求發(fā)送的查詢參數(shù)會(huì)以對(duì)象字面量的形式保存在ctx.query屬性中:

router.get('/person', (ctx, next) => {
 let number = ctx.query.number;
 let temp = {};
 // 判斷編號(hào)是否存在
 temp.data = /^[0-9]+$/.test(number) ? (people[number] ? people[number] : '編號(hào)不存在' ) : '編號(hào)格式錯(cuò)誤';
 temp.success = !!temp.data['number'];
 ctx.body = JSON.stringify(temp); // 響應(yīng)請(qǐng)求,發(fā)送處理后的信息給客戶端
});

處理POST請(qǐng)求,并以json字符串的形式返回?cái)?shù)據(jù)。POST請(qǐng)求的數(shù)據(jù)保存在請(qǐng)求的請(qǐng)求體中,需要用koa-body中間件自動(dòng)解析后才能通過(guò)ctx.request.body獲取請(qǐng)求的數(shù)據(jù):

router.post('/person', (ctx, next) => {
 let query = ctx.request.body;
 let temp = {};
 // 編號(hào)必須是數(shù)字并且大于0,名字必須存在
 if (/^[0-9]+$/.test(query.number) && query.name && parseInt(query.number, 10) > 0) {
 // 判斷編號(hào)是否存在
 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 = '編號(hào)已存在';
 }
 } else {
 temp.success = false;
 temp.data = '信息格式錯(cuò)誤';
 }
 ctx.body = JSON.stringify(temp);
});

完整的router.js:

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

const router = new Router();

// 初始的人員信息對(duì)象,信息從這里儲(chǔ)存和讀取。
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 = {}; // 要返回給客戶端的對(duì)象,通過(guò)success屬性判斷存取是否成功。
 // 判斷編號(hào)是否存在
 temp.data = /^[0-9]+$/.test(number) ? (people[number] ? people[number] : '編號(hào)不存在' ) : '編號(hào)格式錯(cuò)誤';
 temp.success = !!temp.data['number'];
 ctx.body = JSON.stringify(temp);
});

router.post('/person', (ctx, next) => {
 let query = ctx.request.body;
 let temp = {};
 // 編號(hào)必須是數(shù)字并且大于0,名字必須存在
 if (/^[0-9]+$/.test(query.number) && query.name && parseInt(query.number, 10) > 0) {
 // 判斷編號(hào)是否存在
 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 = '編號(hào)已存在';
 }
 } else {
 temp.success = false;
 temp.data = '信息格式錯(cuò)誤';
 }
 ctx.body = JSON.stringify(temp);
});


module.exports = router;

測(cè)試

在控制臺(tái)輸入node server.js可以看到服務(wù)器在3000端口運(yùn)行了,打開(kāi)瀏覽器輸入localhost:3000就可以看到一個(gè)簡(jiǎn)單的前端頁(yè)面:

查詢數(shù)據(jù):

保存數(shù)據(jù):

再次查詢數(shù)據(jù):

至此,一個(gè)完整的Ajax請(qǐng)求demo就完成了。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • nodejs實(shí)現(xiàn)獲取某寶商品分類(lèi)

    nodejs實(shí)現(xiàn)獲取某寶商品分類(lèi)

    這篇文章主要介紹了nodejs實(shí)現(xiàn)獲取某寶商品分類(lèi),十分的簡(jiǎn)單實(shí)用,進(jìn)入后臺(tái)直接打開(kāi)控制臺(tái),把代碼粘進(jìn)去運(yùn)行就OK了,有需要的小伙伴可以參考下。
    2015-05-05
  • 深入理解nodejs搭建靜態(tài)服務(wù)器(實(shí)現(xiàn)命令行)

    深入理解nodejs搭建靜態(tài)服務(wù)器(實(shí)現(xiàn)命令行)

    這篇文章主要介紹了深入理解nodejs搭建靜態(tài)服務(wù)器(實(shí)現(xiàn)命令行),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • Nest.js散列與加密實(shí)例詳解

    Nest.js散列與加密實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于Nest.js散列與加密的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 在Mac下徹底卸載node和npm的方法

    在Mac下徹底卸載node和npm的方法

    今天小編就為大家分享一篇在Mac下徹底卸載node和npm的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • node-sass@4.14.1報(bào)錯(cuò)的最終解決方案分享

    node-sass@4.14.1報(bào)錯(cuò)的最終解決方案分享

    最近在安裝node-sass@4.14.1的時(shí)候遇到了些問(wèn)題,所以下面這篇文章主要給大家介紹了關(guān)于node-sass@4.14.1報(bào)錯(cuò)的最終解決方案,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • npm的安裝與使用

    npm的安裝與使用

    這篇文章介紹了npm的安裝與使用,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • node.js中的fs.readFileSync方法使用說(shuō)明

    node.js中的fs.readFileSync方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.readFileSync方法使用說(shuō)明,本文介紹了fs.readFileSync的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • node express如何實(shí)現(xiàn)json轉(zhuǎn)Excel

    node express如何實(shí)現(xiàn)json轉(zhuǎn)Excel

    這篇文章主要介紹了node express如何實(shí)現(xiàn)json轉(zhuǎn)Excel問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Node.js進(jìn)程管理之子進(jìn)程詳解

    Node.js進(jìn)程管理之子進(jìn)程詳解

    本文詳細(xì)講解了Node.js進(jìn)程管理之子進(jìn)程,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • NodeJS學(xué)習(xí)筆記之(Url,QueryString,Path)模塊

    NodeJS學(xué)習(xí)筆記之(Url,QueryString,Path)模塊

    今天我們來(lái)看一下在nodejs中路徑的相關(guān)操作方法。在我們開(kāi)發(fā)過(guò)程中路徑主要有:URL路徑,在瀏覽器中進(jìn)行使用,當(dāng)然這個(gè)也包含查詢字符串QueryString的相關(guān)操作;而另一種是磁盤(pán)路徑,主要用于文件等等進(jìn)行操作,我們稱為Path,所以我將它們放在一起進(jìn)行總結(jié)學(xué)習(xí)。
    2015-01-01

最新評(píng)論

鄂托克前旗| 达日县| 历史| 察雅县| 正宁县| 浮山县| 吴桥县| 化德县| 浮山县| 临泉县| 贡山| 温泉县| 会泽县| 唐河县| 乌审旗| 安岳县| 溧水县| 孝感市| 鸡西市| 庆云县| 山阳县| 伊金霍洛旗| 三河市| 阿克陶县| 竹北市| 盐池县| 西盟| 遵义市| 柯坪县| 新平| 屯昌县| 高要市| 普洱| 大宁县| 长阳| 林州市| 永丰县| 洪湖市| 淮阳县| 兰西县| 图木舒克市|