欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用nodejs搭建一個簡易HTTP服務的實現(xiàn)示例

 更新時間:2022年05月07日 15:15:58   作者:求知若饑  
本文主要介紹了使用nodejs搭建一個簡易HTTP服務的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

本文只使用nodejs的http模塊搭建一個簡單的http服務。

主要實現(xiàn)功能:

  • 響應客戶端的請求。
  • 處理不同的請求地址并返回信息。
  • 獲取客戶端傳遞的請求體參數(shù)(json字符串)和查詢字符串參數(shù)。
  • 服務端設置cookie和讀取客戶端發(fā)送的cookie。

先搭建一個簡單的HTTP服務

主要使用http模塊的createServer方法和listen方法。
代碼如下:

const http = require('http');
// 初始化http服務
const server = http.createServer();

// 啟動 HTTP 服務監(jiān)聽連接
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.statusCode = 200;
        res.setHeader('Content-Type', 'text/plain');
        res.end('HTTP服務搭建成功');
    } catch (ex) {
	console.error(ex.message);
	res.statusCode = 500;
	res.end('service error');
    }
});

如上代碼所示一個簡單的http服務就搭好了,但是現(xiàn)在還只能返回一些簡單的信息到客戶端,而且也沒有根據(jù)請求地址和請求參數(shù)做不同的處理。 那么接下來我們就先來處理請求地址的問題。

根據(jù)不同的請求地址返回不同的信息

每當收到新的請求時,request事件會被調(diào)用,傳給request事件的回調(diào)函數(shù)可以接受兩個對象:一個request對象,提供了請求的詳細信息。一個response對象,用于設置返回給客戶端的信息。 我們可以從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, '響應成功');
        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ù)據(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, '響應成功');
        res.end('成功收到請求');
    } catch (ex) {
	console.error(ex.message);
	res.statusCode = 500;
	res.end('service error');
    }
});

通過以上代碼我們就實現(xiàn)了獲取請求體里的json格式數(shù)據(jù)和查詢字符串數(shù)據(jù)參數(shù)。

實現(xiàn)服務端設置(跨域)cookie和讀取客戶端發(fā)送的cookie

服務器要允許跨域帶憑據(jù)的請求,需要設置響應頭Access-Control-Allow-Credentials為true,且響應頭Access-Control-Allow-Origin的值不能為‘*’,必須為一個具體的域名。
前端要允許跨域發(fā)送憑據(jù)到服務器,則需要設置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,必須設置為具體的域,不能是‘*'
        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': () => {
            // 設置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, '響應成功');
        res.end('成功收到請求');
    } catch (ex) {
	console.error(ex.message);
	res.statusCode = 500;
	res.end('service error');
    }
});

到此,我們已經(jīng)實現(xiàn)了一個簡單的HTTP服務,更多相關(guān)nodejs搭建HTTP服務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • node.js中的url.format方法使用說明

    node.js中的url.format方法使用說明

    這篇文章主要介紹了node.js中的url.format方法使用說明,本文介紹了url.format的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 淺談Node框架接入ELK實踐總結(jié)

    淺談Node框架接入ELK實踐總結(jié)

    這篇文章主要介紹了淺談Node框架接入ELK實踐總結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • connect中間件session、cookie的使用方法分享

    connect中間件session、cookie的使用方法分享

    今天大象哥用了下connect的session和cookie,感覺還挺好用的,分享一下(里面坑挺多的,文檔寫的太模糊了,費了哥不少時間)。
    2014-06-06
  • Node.js的MongoDB驅(qū)動Mongoose基本使用教程

    Node.js的MongoDB驅(qū)動Mongoose基本使用教程

    這篇文章主要介紹了Node.js的MongoDB驅(qū)動Mongoose的基本使用教程,前端js+后端Node.js+數(shù)據(jù)庫MongoDB是當下流行的JavaScript全棧開發(fā)方案,需要的朋友可以參考下
    2016-03-03
  • Centos6.8下Node.js安裝教程

    Centos6.8下Node.js安裝教程

    這篇文章主要為大家詳細介紹了Centos6.8下Node.js安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • NestJS開發(fā)核心概念Providers類基本用法詳解

    NestJS開發(fā)核心概念Providers類基本用法詳解

    這篇文章主要為大家介紹了NestJS開發(fā)核心概念Providers類基本用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • node.js中的fs.fstatSync方法使用說明

    node.js中的fs.fstatSync方法使用說明

    這篇文章主要介紹了node.js中的fs.fstatSync方法使用說明,本文介紹了fs.fstatSync的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • node.js中fs.stat與fs.fstat的區(qū)別詳解

    node.js中fs.stat與fs.fstat的區(qū)別詳解

    fs.stat和fs.fstat他們都是用來獲取文件的狀態(tài)信息,下面這篇文章主要給大家介紹了關(guān)于node.js中fs.stat與fs.fstat區(qū)別的相關(guān)資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-06-06
  • nodejs中實現(xiàn)修改用戶路由功能

    nodejs中實現(xiàn)修改用戶路由功能

    這篇文章主要介紹了nodejs中實現(xiàn)修改用戶路由功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-05-05
  • Node.js 利用cheerio制作簡單的網(wǎng)頁爬蟲示例

    Node.js 利用cheerio制作簡單的網(wǎng)頁爬蟲示例

    本篇文章主要介紹了Node.js 利用cheerio制作簡單的網(wǎng)頁爬蟲示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03

最新評論