nodejs如何实现ajax,nodejs使用静态服务器处理ajax
如需轉載請注明來源與作者
上一次,手寫了一個靜態服務器。這次我們想更進一步:返回給前端ajax數據。注意:這里只是一個演示,所以所有ajax傳入服務器的數據,我不會經過處理直接返回
文件夾
Tips :
fs.readFile(url,'utf8',(error,data)=>{
response.end(data);
})
上次使用的是utf-8編碼格式來讀取文件,但是這樣設置遇到返回圖片就會報錯。所以,我們可以刪除utf8這個字段,這樣才能成功返回圖片。
預處理:
首先文件夾的服務器文件處理也就是APP文件夾。應該進行進一步的抽離。
使用Promise作連接。
3.png
這樣做能讓模塊之間相互獨立又相互連接,使代碼更好維護
接著我們把APP(APP/index.js)的樞紐進行整合:
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'})
//標記一下返回頭
response.end(data);
})
}
}
}
module.exports = APP
靜態服務器(APP/static-server/index.js)的處理:
let fs = require('fs');
let path = require('path');
//對url進行處理讓它能夠定位到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進行同步的處理
resolve(data)
})
})
}
在前端代碼引入jq與js,寫點ajax
$.get({
url : 'user.action', //給每個ajax的請求后綴添加'.action'以作標識
dataType : 'json'
}).done(function(data){
console.log(data) //在這里我們直接打出數據
})
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在映射表里面是否有對應的信息
return Promise.resolve(JSON.stringify(data))
//必須轉換成字符串,否則response.end的第一個參數必須是字符串或者buffer
}
//上述代碼運行成功后console打出的應該是一個對象。
APP/index.js的修改:
class APP {
initSever() {
return (request, response) => {
let {url} = request;
apiServer(request).then((val) => {
//一個url進入服務器先在apiServer里面進行一個判斷,
//返回出來的值如果是一個undefined就走靜態資源路線
//否則就是ajax請求,直接返回給前端。
if (val) {
return val;
} else {
return staticServer(url)
}
})
.then((data) => {
//這里是用來把數據返回給前端的地方,在這一塊主要是處理返回頭。
response.writeHead(200, 'resolve ok', {
'X-powered-by': 'Node.js'
})
response.end(data);
})
}
}
}
結果:
post方法的處理
由于post比較復雜在這里先講一下思路
post的處理比get的處理要煩瑣得多。
post請求,我們往往是要傳遞數據給服務器。前端返回給后端服務器的形式是用stream的形式,所以我們可以在request對象上獲取前端返回的數據。
返回數據的處理:由于中文在stream傳輸的過程是以buffer形式,所以會造成字符串丟失,所以我們需要使用Buffer.concat進行字符的拼接。
4.png
public/js/index.js添加:
$.ajax({
method: 'POST',
url : '/getMsg.action',
data : JSON.stringify({ //注意這里應該轉成字符串否則傳到服務器會變成car=BMW&msg=hello world
car : 'BMW',
msg : 'hello world'
}),
dataType:'json'
}).done(function(data){
console.log(JSON.parse(data)) //在這里我們直接打出數據
})
·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添加事件,監聽data是否傳入數據,該方法在stream對象上
info.push(chunk)//為什么用數組,為了防止中文數據丟失所以我們把每一個buffer用數組存起來
//你也可以直接使用字符串拼接,如:info+=chunk;這樣寫相當于:info=info.toString() + chunk.toString()
}).on('end', () => {
info = Buffer.concat(info).toString(); // Buffer.concat用來拼接所有的buffer
//在這里你可以處理你想要的數據 doSomething(info)
resolve(JSON.stringify(info));//這里我只是把前端的數據拿過來沒有做任何的改動直接返回
})
})
}
}
APP/index.js不用特殊處理跟之前保持一致就好。
最后:
最后
總結
以上是生活随笔為你收集整理的nodejs如何实现ajax,nodejs使用静态服务器处理ajax的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三年级计算机画图,三年级面积作图题_小学
- 下一篇: jsch 移动服务器上文件,jsch上传