日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nodejs如何实现ajax,nodejs使用静态服务器处理ajax

發(fā)布時間:2024/4/18 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nodejs如何实现ajax,nodejs使用静态服务器处理ajax 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如需轉(zhuǎn)載請注明來源與作者

上一次,手寫了一個靜態(tài)服務(wù)器。這次我們想更進(jìn)一步:返回給前端ajax數(shù)據(jù)。注意:這里只是一個演示,所以所有ajax傳入服務(wù)器的數(shù)據(jù),我不會經(jīng)過處理直接返回

文件夾

Tips :

fs.readFile(url,'utf8',(error,data)=>{

response.end(data);

})

上次使用的是utf-8編碼格式來讀取文件,但是這樣設(shè)置遇到返回圖片就會報(bào)錯。所以,我們可以刪除utf8這個字段,這樣才能成功返回圖片。

預(yù)處理:

首先文件夾的服務(wù)器文件處理也就是APP文件夾。應(yīng)該進(jìn)行進(jìn)一步的抽離。

使用Promise作連接。

3.png

這樣做能讓模塊之間相互獨(dú)立又相互連接,使代碼更好維護(hù)

接著我們把APP(APP/index.js)的樞紐進(jìn)行整合:

let path = require('path')

let fs = require('fs')

let staticServer = require('./static-server');

class APP {

initSever() {

return (request, response) => {

let {url} = request;

staticServer(url).then((data)=>{

//這里staticServer返回的是一個promise

response.writeHead(200,'resolve ok',{'X-powered-by': 'Node.js'})

//標(biāo)記一下返回頭

response.end(data);

})

}

}

}

module.exports = APP

靜態(tài)服務(wù)器(APP/static-server/index.js)的處理:

let fs = require('fs');

let path = require('path');

//對url進(jìn)行處理讓它能夠定位到public下面的資源

let getPath = (url) => {

let urlHeader = './public'

return path.resolve(process.cwd(), urlHeader + url)

}

module.exports = (url) => {

return new Promise((resolve, reject) => {

if (url === '/') url = '/index.html';

url = getPath(url)

fs.readFile(url, (error, data) => {

//如果你不使用Promise的話,你可以使用fs,readFileSync進(jìn)行同步的處理

resolve(data)

})

})

}

在前端代碼引入jq與js,寫點(diǎn)ajax

$.get({

url : 'user.action', //給每個ajax的請求后綴添加'.action'以作標(biāo)識

dataType : 'json'

}).done(function(data){

console.log(data) //在這里我們直接打出數(shù)據(jù)

})

get方法的處理

api-server

let msgMap = {

'/user.action' : {

pet : 'dog',

color : 'white'

}

}

let data ='';

module.exports= (req)=>{

let {url} = req; // 這里先傳req,接下來處理post會用到

data = msgMap[url]; //判斷該url在映射表里面是否有對應(yīng)的信息

return Promise.resolve(JSON.stringify(data))

//必須轉(zhuǎn)換成字符串,否則response.end的第一個參數(shù)必須是字符串或者buffer

}

//上述代碼運(yùn)行成功后console打出的應(yīng)該是一個對象。

APP/index.js的修改:

class APP {

initSever() {

return (request, response) => {

let {url} = request;

apiServer(request).then((val) => {

//一個url進(jìn)入服務(wù)器先在apiServer里面進(jìn)行一個判斷,

//返回出來的值如果是一個undefined就走靜態(tài)資源路線

//否則就是ajax請求,直接返回給前端。

if (val) {

return val;

} else {

return staticServer(url)

}

})

.then((data) => {

//這里是用來把數(shù)據(jù)返回給前端的地方,在這一塊主要是處理返回頭。

response.writeHead(200, 'resolve ok', {

'X-powered-by': 'Node.js'

})

response.end(data);

})

}

}

}

結(jié)果:

post方法的處理

由于post比較復(fù)雜在這里先講一下思路

post的處理比get的處理要煩瑣得多。

post請求,我們往往是要傳遞數(shù)據(jù)給服務(wù)器。前端返回給后端服務(wù)器的形式是用stream的形式,所以我們可以在request對象上獲取前端返回的數(shù)據(jù)。

返回?cái)?shù)據(jù)的處理:由于中文在stream傳輸?shù)倪^程是以buffer形式,所以會造成字符串丟失,所以我們需要使用Buffer.concat進(jìn)行字符的拼接。

4.png

public/js/index.js添加:

$.ajax({

method: 'POST',

url : '/getMsg.action',

data : JSON.stringify({ //注意這里應(yīng)該轉(zhuǎn)成字符串否則傳到服務(wù)器會變成car=BMW&msg=hello world

car : 'BMW',

msg : 'hello world'

}),

dataType:'json'

}).done(function(data){

console.log(JSON.parse(data)) //在這里我們直接打出數(shù)據(jù)

})

·api-server/index.js·

let msgMap = {

'/user.action': {

pet: 'dog',

color: 'white'

}

}

let data = '';

let info = [];

module.exports = (req) => {

let {url} = req;

if (req.method.toLowerCase() === 'get') { //這一塊不多說,處理get請求

data = msgMap[url];

return Promise.resolve(JSON.stringify(data))

} else {

return new Promise((resolve, reject) => {

req.on('data', (chunk) => {

//on類似于jquery添加事件,監(jiān)聽data是否傳入數(shù)據(jù),該方法在stream對象上

info.push(chunk)//為什么用數(shù)組,為了防止中文數(shù)據(jù)丟失所以我們把每一個buffer用數(shù)組存起來

//你也可以直接使用字符串拼接,如:info+=chunk;這樣寫相當(dāng)于:info=info.toString() + chunk.toString()

}).on('end', () => {

info = Buffer.concat(info).toString(); // Buffer.concat用來拼接所有的buffer

//在這里你可以處理你想要的數(shù)據(jù) doSomething(info)

resolve(JSON.stringify(info));//這里我只是把前端的數(shù)據(jù)拿過來沒有做任何的改動直接返回

})

})

}

}

APP/index.js不用特殊處理跟之前保持一致就好。

最后:

最后

總結(jié)

以上是生活随笔為你收集整理的nodejs如何实现ajax,nodejs使用静态服务器处理ajax的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。