使用nodejs搭建一個簡易HTTP服務(wù)的實現(xiàn)示例
本文只使用nodejs的http模塊搭建一個簡單的http服務(wù)。
主要實現(xiàn)功能:
- 響應(yīng)客戶端的請求。
- 處理不同的請求地址并返回信息。
- 獲取客戶端傳遞的請求體參數(shù)(json字符串)和查詢字符串參數(shù)。
- 服務(wù)端設(shè)置cookie和讀取客戶端發(fā)送的cookie。
先搭建一個簡單的HTTP服務(wù)
主要使用http模塊的createServer方法和listen方法。
代碼如下:
const http = require('http');
// 初始化http服務(wù)
const server = http.createServer();
// 啟動 HTTP 服務(wù)監(jiān)聽連接
server.listen(8000, () => {
console.log('service run: http://127.0.0.1:8000');
});
// 偵聽請求事件
server.on('request', (req, res) => {
try {
// 設(shè)置響應(yīng)頭允許跨域
res.setHeader('Access-Control-Allow-Origin', '*');
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('HTTP服務(wù)搭建成功');
} catch (ex) {
console.error(ex.message);
res.statusCode = 500;
res.end('service error');
}
});如上代碼所示一個簡單的http服務(wù)就搭好了,但是現(xiàn)在還只能返回一些簡單的信息到客戶端,而且也沒有根據(jù)請求地址和請求參數(shù)做不同的處理。 那么接下來我們就先來處理請求地址的問題。
根據(jù)不同的請求地址返回不同的信息
每當(dāng)收到新的請求時,request事件會被調(diào)用,傳給request事件的回調(diào)函數(shù)可以接受兩個對象:一個request對象,提供了請求的詳細信息。一個response對象,用于設(shè)置返回給客戶端的信息。 我們可以從request對象的url屬性中獲取請求地址,代碼如下:
const http = require('http');
const server = http.createServer();
server.listen(8000, () => {
console.log('service run: http://127.0.0.1:8000');
});
server.on('request', (req, res) => {
try {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Content-Type', 'application/json');
// 獲取請求地址
const urls = req.url.split('?');
const requestAddress = urls[0];
console.log(`請求地址:${ requestAddress }`);
const callback = {
'/test': () => {
res.statusCode = 200;
res.end(JSON.stringify({text: '通過測試'}));
},
'/': () => {
res.statusCode = 200;
res.end(JSON.stringify({text: 'hello world'}));
}
}
if (callback[requestAddress] instanceof Function) {
return callback[requestAddress]()
}
res.writeHead(200, '響應(yīng)成功');
res.end('成功收到請求');
} catch (ex) {
console.error(ex.message);
res.statusCode = 500;
res.end('service error');
}
});如上代碼實現(xiàn)了不同請求地址返回不同信息的功能,但是也還存在一些問題。例如:沒有實現(xiàn)獲取請求體參數(shù)和查詢字符串。
那么我們接下來就來添加獲取請求參數(shù)的代碼。
獲取請求參數(shù)
查詢字符串可以從request對象的url屬性中獲取,請求體參數(shù)可以通過偵聽request對象的data事件獲取。如下所示:
const http = require('http');
const server = http.createServer();
server.listen(8000, () => {
console.log('service run: http://127.0.0.1:8000');
});
server.on('request', (req, res) => {
try {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Content-Type', 'application/json');
const urls = req.url.split('?');
const requestAddress = urls[0];
console.log(`請求地址:${ requestAddress }`);
const callback = {
'/test': () => {
console.log(`查詢字符串:${urls[1]}`);
if (req.method === 'POST') {
// post請求,獲取json格式的請求體參數(shù)
let data = '';
// req對象是一個流(參考Stream API),可以監(jiān)聽它的data事件來獲取數(shù)據(jù)塊。
req.on('data', (chunk) => {
// 這里假設(shè)收到的數(shù)據(jù)是字符串,隱式轉(zhuǎn)換:二進制數(shù)據(jù) => 字符串
data += chunk;
});
// 在獲取數(shù)據(jù)結(jié)束時,調(diào)用end事件
req.on('end', () => {
data = JSON.parse(data);
console.log('請求體:', data);
});
}
res.statusCode = 200;
res.end(JSON.stringify({text: '通過測試'}));
},
'/': () => {
console.log(`查詢字符串:${urls[1]}`);
res.statusCode = 200;
res.end(JSON.stringify({text: 'hello world'}));
}
}
if (callback[requestAddress] instanceof Function) {
return callback[requestAddress]()
}
res.writeHead(200, '響應(yīng)成功');
res.end('成功收到請求');
} catch (ex) {
console.error(ex.message);
res.statusCode = 500;
res.end('service error');
}
});通過以上代碼我們就實現(xiàn)了獲取請求體里的json格式數(shù)據(jù)和查詢字符串?dāng)?shù)據(jù)參數(shù)。
實現(xiàn)服務(wù)端設(shè)置(跨域)cookie和讀取客戶端發(fā)送的cookie
服務(wù)器要允許跨域帶憑據(jù)的請求,需要設(shè)置響應(yīng)頭Access-Control-Allow-Credentials為true,且響應(yīng)頭Access-Control-Allow-Origin的值不能為‘*’,必須為一個具體的域名。
前端要允許跨域發(fā)送憑據(jù)到服務(wù)器,則需要設(shè)置XMLHttpRequest對象的withCredentials屬性,將其值修改為true即可。
const http = require('http');
const server = http.createServer();
server.listen(8000, () => {
console.log('service run: http://127.0.0.1:8000');
});
server.on('request', (req, res) => {
try {
// 跨域允許攜帶憑據(jù)(cookie之類)
res.setHeader('Access-Control-Allow-Credentials', 'true');
// 要允許跨域攜帶cookie,必須設(shè)置為具體的域,不能是‘*'
res.setHeader('Access-Control-Allow-Origin', 'http://127.0.0.1:5500');
res.setHeader('Content-Type', 'application/json');
const requestAddress = req.url.split('?')[0];
const callback = {
'/login': () => {
// 設(shè)置cookie
res.setHeader('Set-Cookie', 'name=wst;age=24;Max-Age=666;');
res.statusCode = 200;
// 返回json格式數(shù)據(jù)到客戶端
res.end(JSON.stringify({text: '登錄成功'}));
},
'/': () => {
// 通過req.headers.cookie讀取cookie
console.log(req.headers.cookie)
res.statusCode = 200;
res.end(JSON.stringify({text: 'hello world'}));
}
}
if (callback[requestAddress] instanceof Function) {
return callback[requestAddress]()
}
res.writeHead(200, '響應(yīng)成功');
res.end('成功收到請求');
} catch (ex) {
console.error(ex.message);
res.statusCode = 500;
res.end('service error');
}
});到此,我們已經(jīng)實現(xiàn)了一個簡單的HTTP服務(wù),更多相關(guān)nodejs搭建HTTP服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用NodeJS?5分鐘?連接?Redis?讀寫操作的詳細過程
這篇文章主要介紹了NodeJS?5分鐘?連接?Redis?讀寫操作,本文給大家介紹的非常詳細,對大家學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07
基于node搭建服務(wù)器,寫接口,調(diào)接口,跨域的實例
今天小編就為大家分享一篇基于node搭建服務(wù)器,寫接口,調(diào)接口,跨域的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
node.js平臺下利用cookie實現(xiàn)記住密碼登陸(Express+Ejs+Mysql)
這篇文章主要介紹了node.js平臺下利用cookie實現(xiàn)記住密碼登陸(Express+Ejs+Mysql),具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-04-04
node.js利用redis數(shù)據(jù)庫緩存數(shù)據(jù)的方法
Redis數(shù)據(jù)庫采用極簡的設(shè)計思想,最新版的源碼包還不到2Mb。其在使用上也有別于一般的數(shù)據(jù)庫。下面這篇文章就來給大家介紹了node.js利用redis數(shù)據(jù)庫緩存數(shù)據(jù)的方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-03-03

