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

