本篇文章分享給大家的內容是關於js中回呼函數實現一個http伺服器,內容很詳細,接下來我們就來看看具體的內容,希望可以協助到大家。
網路操作
首先使用http模組實現一個http伺服器
var http = require('http'); // 使用http模組http.createServer ( function (request, response) { response.writeHead(200, {'Content-Type': 'text-plain'}); // http回應標頭部 response.end('hello word\n'); // 返回的內容 } ).listen(8124); // 監聽8124連接埠
PS C:\Users\mingm\Desktop\test> node main.js
訪問http://127.0.0.1:8124/ 返回hello word
一些api
http模組
兩種方式,
作為伺服器端使用的時,建立一個http伺服器,監聽http用戶端請求,並返迴響應。
作為用戶端使用的時候,發起http用戶端請求,用來獲得伺服器端的響應
伺服器端的是以事件作為驅動的,建立伺服器時的回呼函數就會被調用一次,即,這是事件驅動
http要求標頭
http的請求本質是資料流,由要求標頭和請求體組成。
開啟瀏覽器的開發人員工具,選擇network面板,然後,重新整理頁面,再次,選擇一個檔案,在headers視窗中,顯示出當前檔案請求的http頭部資訊
<img src="https://melovemingming-125387...;>
同樣,Firefox的也一樣
<img src="https://melovemingming-125387...;>
先是要求標頭,後是請求體
http請求發送給伺服器時,是從頭到尾一個一個位元組以資料流的方式發送,http模組建立的http伺服器在接收到完整的要求標頭以後,進行回呼函數,
var http = require('http'); // 使用http模組http.createServer ( function (request, response) { var body = []; console.log(request.method); console.log("--------------"); console.log(request.headers); console.log("---------------"); } ).listen(8124); // 監聽8124連接埠
PS C:\Users\mingm\Desktop\test> node main.jsGET--------------{ host: '127.0.0.1:8124', connection: 'keep-alive', 'cache-control': 'max-age=0', 'upgrade-insecure-requests': '1', dnt: '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36', accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9' }---------------
回呼函數
var fs = require("fs");fs.readFile('input.txt', function (err, data) { console.log("3333"); console.log(err); console.log(data.toString()); console.log("3333");});console.log("程式執行結束!");
PS C:\Users\mingm\Desktop\test> node main.js程式執行結束!3333null333333333333333333333333333333PS C:\Users\mingm\Desktop\test>
當遇到需要i/o操作的時候,先跳過執行,在執行當前的內容。所以結果為此,然後在將執行完成的結果傳給參數列表的最後一個函數,所以最後一個函數為回調
http的回呼函數,請求
var http = require('http');http.createServer( function (request, response) { var body = []; console.log(request.method); console.log(request.headers); console.log(1111111111); console.log(body); request.on('end', function () { body = Buffer.concat(body); console.log(222222222222222); console.log(body.toString()); }); console.log(4444444444444); response.writeHead(200, {'Content-Type': 'text-plain'}); response.end('hello word\n'); console.log(55555555555); }).listen(8124);
執行結果
PS C:\Users\mingm\Desktop\test> node main.jsGET{ host: '127.0.0.1:8124', connection: 'keep-alive', 'cache-control': 'max-age=0', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36', dnt: '1', accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9' }1111111111[]444444444444455555555555222222222222222GET{ host: '127.0.0.1:8124', connection: 'keep-alive', pragma: 'no-cache', 'cache-control': 'no-cache', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36', dnt: '1', accept: 'image/webp,image/apng,image/*,*/*;q=0.8', referer: 'http://127.0.0.1:8124/', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9' }1111111111[]444444444444455555555555222222222222222
此執行為非同步執行,先執行到
console.log(body);
由於request.on需要等待返回,所以非同步執行下方的語句
console.log(444);
接著返回內容,再執行request.on,將結果通知回到函數的最後一個參數,然後執行完畢。
http響應
服務端原樣將用戶端請求的請求體,返回給用戶端
PS C:\Users\mingm\Desktop\test> node main.js4444444444442222222233333333555555
var http = require("http");http.createServer(function (request, response){ console.log(444444444444); response.writeHead(200, { 'Content-Type': 'text/plain' }); // 為回應標頭,即原路發送給用戶端 request.on( "data", function (chunk) { response.write(chunk); console.log(111111); }); console.log(22222222); request.on('end', function() {response.end();console.log(555555)}); console.log(33333333); }).listen(8124);
寫的有點亂
http用戶端
node發送一個http用戶端請求
var options = { hostname: 'www.iming.info', port: 80, // 連接埠為80 path: '/upload', // 請求的路徑 method: 'POST', // 請求的方法為post方法 headers: { 'Content-Type': 'application/x-www-form-urlencoded' // 頭部資訊 },}var http = require('http');var request = http.request(options, function (response) {});request.write('hello word!');request.end();
以上發送了一個http請求。