成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

淺析用Node創建一個簡單的HTTP服務器

怎么使用NodeJS創建HTTP服務器?下面本篇文章給大家介紹一下使用Node創建一個簡單的HTTP服務器的方法,希望對大家有所幫助!

淺析用Node創建一個簡單的HTTP服務器

node.js極速入門課程:進入學習

1. 使用Node.js直接運行JavaScript腳本

node.js基于Chromev8引擎運行js代碼,因此我們可以擺脫瀏覽器環境,直接在控制臺中運行js代碼,比如下面這個hello world代碼

console.log('hello world');
登錄后復制

控制臺中直接使用node即可運行

淺析用Node創建一個簡單的HTTP服務器


2. 創建一個簡單的HTTP服務器

node.js的內置模塊http提供了基本的http服務的能力,基于CommonJS規范,我們可以使用require導入http模塊進行使用http模塊中有一個createServer函數能夠讓我們創建一個http服務器 其接收一個回調函數作為參數,這個回調函數接收兩個參數 — requestresponse。【相關教程推薦:nodejs視頻教程】

  • request包括所有客戶端請求的信息,比如url、請求頭header、請求方式和請求體等
  • response主要用于返回信息給客戶端,封裝了一些操作響應體相關的操作,比如response.writeHead方法就可以讓我們自定義返回體的頭部信息和狀態碼

當我們將響應體處理好了之后,調用response.end()方法就可以將響應體發送給客戶端 使用createServer函數只是幫我們創建了一個Server對象,并沒有讓其開啟監聽,我們還需要調用server對象的listen方法才可以進行監聽,真正作為一個服務器開始運行

  • listen方法的第一個參數是監聽的端口號,第二個參數則是綁定的主機ip,第三個參數是一個回調函數,會被http模塊異步調用,當遇到錯誤的時候,就能夠在這個回調函數的第一個參數中獲取到拋出的異常 ,我們可以選擇對異常進行處理,讓我們的服務器更加健壯

下面是使用http模塊創建一個簡單服務器的例子

const { createServer } = require('http'); const HOST = 'localhost'; const PORT = '8080';  const server = createServer((req, resp) => {   // the first param is status code it returns     // and the second param is response header info   resp.writeHead(200, { 'Content-Type': 'text/plain' });        console.log('server is working...');        // call end method to tell server that the request has been fulfilled   resp.end('hello nodejs http server'); });  server.listen(PORT, HOST, (error) => {   if (error) {     console.log('Something wrong: ', error);       return;   }     console.log(`server is listening on http://${HOST}:${PORT} ...`); });
登錄后復制

可以直接嘗試用node運行它,創造一個屬于你的服務器!服務器運行后,瀏覽器訪問http://localhost:8080即可訪問到這個服務器

淺析用Node創建一個簡單的HTTP服務器

也可以使用nodemon運行它,這樣當我們的代碼發生變化的時候就不需要手動終止程序再重新運行了

npm i -g nodemon
登錄后復制

建議全局安裝它,這樣就可以直接使用,不需要通過npx nodemon去使用 使用也很簡單,直接將node命令改成nodemon命令即可

nodemon http-server.js
登錄后復制

淺析用Node創建一個簡單的HTTP服務器


3. 加上類型提示

前面我們在使用createServer以及resp對象的時候,看不到任何的語法提示,必須隨時跟著node官方文檔去邊用邊查,有點不方便 但是沒關系,我們可以使用ts.d.ts文件幫助我們提供語法提示功能,注意,我們不是使用ts進行開發,只是使用它的語法提示功能而已

  1. 初始化項目 — npm init -y
  2. 安裝@types/nodepnpm i @types/node -D
  3. 在項目目錄下創建jsconfig.json文件,將node_modules排除在外,沒必要對其進行檢查

{  "compilerOptions": {     "checkJs": true   },     "exclude": ["node_modules", "**/node_modules/*"] }
登錄后復制

不知道你是否有發現上面的代碼其實是有一處錯誤的呢?checkJs能夠幫助我們檢查類型錯誤問題,可以根據需要選擇是否開啟 可以看到,開啟檢查后立馬就給我們提示了參數類型不匹配的問題

淺析用Node創建一個簡單的HTTP服務器

這時候將鼠標懸浮在listen方法上,就能夠看到該方法的簽名

淺析用Node創建一個簡單的HTTP服務器

可以看到,原來port參數需要是number類型,但是我們定義的時候是string類型,所以沒匹配上,將其修改為number8080即可 而且可以直接查看到相關api的文檔,不需要打開node官方的文檔找半天去查看了


4. 返回多個字符串的響應體

前面我們的簡單http server中只返回了一句話,那么是否能夠返回多句話呢? 這就要用到resp對象的write方法了,end只能夠返回一次內容,而是用write方法,我們可以多次寫入內容到響應體中,最后只用調用一次end,并且不傳遞任何參數,只讓他完成發送響應體的功能

const { createServer } = require("http"); const HOST = "localhost"; const PORT = 8080;  const server = createServer((req, resp) => {   resp.writeHead(200, { "Content-Type": "text/plain" });     console.log("server is working...");        // write some lorem sentences   resp.write("Lorem ipsum dolor sit amet consectetur adipisicing elit.n");   resp.write("Omnis eligendi aperiam delectus?n");   resp.write("Aut, quam quo!n");    resp.end(); });  server.listen(PORT, HOST, (error) => {   if (error) {       console.log("Something wrong: ", error);       return;   }     console.log(`server is listening on http://${HOST}:${PORT} ...`); });
登錄后復制

這次我們寫入了三句話,現在的效果就變成這樣啦

淺析用Node創建一個簡單的HTTP服務器


5. 返回html

我們不僅可以返回字符串給瀏覽器,還可以直接讀取html文件的內容并將其作為結果返回給瀏覽器 這就需要用到另一個Node.js的內置模塊 — fs,該模塊提供了文件操作的功能 使用fs.readFile可以異步進行讀取文件的操作,但是它不會返回promise對象,因此我們需要傳入回調去處理讀取到文件后的操作 還可以使用fs.readFileSync進行同步阻塞讀取文件,這里我們選擇異步讀取

const { createServer } = require("http"); const fs = require("fs"); const HOST = "localhost";  const PORT = 8080;const server = createServer((req, resp) => {   // change the MIME type from text/plain to text/html   resp.writeHead(200, { "Content-Type": "text/html" });        // read the html file content   fs.readFile("index.html", (err, data) => {       if (err) {         console.error(               "an error occurred while reading the html file content: ",         err       );      throw err;     }         console.log("operation success!");      resp.write(data);     resp.end();   }); });  server.listen(PORT, HOST, (error) => {   if (error) {       console.log("Something wrong: ", error);       return;   }     console.log(`server is listening on http://${HOST}:${PORT} ...`); });
登錄后復制

現在的結果就像下面這樣:

淺析用Node創建一個簡單的HTTP服務器

成功將html返回注意:這里需要將響應頭的**Content-Type**改為**text/html**,告知瀏覽器我們返回的是**html**文件的內容,如果仍然以**text/plain**返回的話,瀏覽器不會對返回的內容進行解析,即便它是符合**html**語法的也不會解析,就像下面這樣:

淺析用Node創建一個簡單的HTTP服務器


6. 返回JSON

當我們需要編寫一個后端服務器,只負責返回接口數據的時候,就需要返回json格式的內容了,相信聰明的你也知道該怎么處理了:

  1. MIME類型設置為application/json
  2. resp.write的時候傳入的是json字符串,可以使用JSON.stringify處理對象后返回

const { createServer } = require("http"); const HOST = "localhost"; const PORT = 8080;  const server = createServer((req, resp) => {   // change the MIME type to application/json   resp.writeHead(200, { "Content-Type": "application/json" });        // create a json data by using an object     const jsonDataObj = {       code: 0,           message: "success",           data: {             name: "plasticine",                 age: 20,                 hobby: "coding",     },   };    resp.write(JSON.stringify(jsonDataObj));   resp.end(); });  server.listen(PORT, HOST, (error) => {   if (error) {       console.log("Something wrong: ", error);          return;   }     console.log(`server is listening on http://${HOST}:${PORT} ...`); });
登錄后復制

結果如下:

淺析用Node創建一個簡單的HTTP服務器


7. 返回pdf文件

和之前返回html文件的思路類似,都是一個設置響應頭MIME類型,讀取文件,返回文件內容的過程 但是這次我們搞點不一樣的 我們的思路是在服務器運行的時候生成一個pdf文件,并將它返回 還需要將MIME的類型改為application/pdf生成pdf文件需要用到一個庫 — pdfkit

pnpm i pdfkit
登錄后復制

首先我們編寫一個創建pdf文件的函數,因為創建pdf文件還需要進行一些寫入操作,不確定什么時候會完成,但是我們的請求必須等到pdf文件創建完成后才能得到響應 所以我們需要將它變成異步進行的,返回一個promise

/**  * @description 創建 pdf 文件  */const createPdf = () => {    return new Promise((resolve, reject) => {        if (!fs.existsSync("example.pdf")) {              // create a PDFDocument object              const doc = new PDFDocument();                // create write stream by piping the pdf content.        doc.pipe(fs.createWriteStream("example.pdf"));                   // add some contents to pdf document       doc.fontSize(16).text("Hello PDF", 100, 100);                    // complete the operation of generating PDF file.       doc.end();     }      resolve("success");   }); };
登錄后復制

這里使用到了管道操作,將PDFDocument對象的內容通過管道傳到新創建的寫入流中,當完成操作后我們就通過resovle告知外界已經創建好pdf文件了 然后在服務端代碼中調用

const server = createServer(async (req, resp) => {   // change the MIME type to application/pdf   resp.writeHead(200, { "Content-Type": "application/pdf" });        // create pdf file     await createPdf();        // read created pdf file   fs.readFile("example.pdf", (err, data) => {       if (err) {         console.error(                 "an error occurred while reading the pdf file content: ",         err       );             throw err;     }         console.log("operation success!");      resp.end(data);   }); });  server.listen(PORT, HOST, (error) => {   if (error) {       console.log("Something wrong: ", error);           return;   }     console.log(`server is listening on http://${HOST}:${PORT} ...`); });
登錄后復制

現在瀏覽器就可以讀取到創建的pdf文件了

淺析用Node創建一個簡單的HTTP服務器


8. 返回音頻文件

思路依然是一樣的,讀取一個音頻文件,然后通過管道將它送到resp對象中再返回即可

const { createServer } = require("http"); const { stat, createReadStream } = require("fs"); const HOST = "localhost"; const PORT = 8080;  const server = createServer((req, resp) => {   // change the MIME type to audio/mpe   resp.writeHead(200, { "Content-Type": "audio/mp3" });     const mp3FileName = "audio.mp3";    stat(mp3FileName, (err, stats) => {     if (stats.isFile()) {             const rs = createReadStream(mp3FileName);                    // pipe the read stream to resp       rs.pipe(resp);     } else {       resp.end("mp3 file not exists");     }   }); });  server.listen(PORT, HOST, (error) => {   if (error) {       console.log("Something wrong: ", error);       return;   }     console.log(`server is listening on http://${HOST}:${PORT} ...`); });
登錄后復制

效果如下

淺析用Node創建一個簡單的HTTP服務器

打開后就是一個播放音頻的界面,這是chrome提供的對音頻文件的展示,并且打開控制臺會發現有返回音頻文件

淺析用Node創建一個簡單的HTTP服務器

注意:將音頻文件流通過管道傳到**resp**后,不需要調用**resp.end()**方法,因為這會關閉整個響應,導致音頻文件無法獲取

淺析用Node創建一個簡單的HTTP服務器

淺析用Node創建一個簡單的HTTP服務器


9. 返回視頻文件

視頻文件和音頻文件的處理是一樣的,只是MIME的類型要改成video/mp4,其他都一樣

const { createServer } = require("http"); const { stat, createReadStream } = require("fs"); const HOST = "localhost"; const PORT = 8080; const server = createServer((req, resp) => {   // change the MIME type to audio/mpe   resp.writeHead(200, { "Content-Type": "audio/mp4" });     const mp4FileName = "video.mp4";    stat(mp4FileName, (err, stats) => {       if (stats.isFile()) {            const rs = createReadStream(mp4FileName);            // pipe the read stream to resp       rs.pipe(resp);     } else {       resp.end("mp4 file not exists");     }   }); });  server.listen(PORT, HOST, (error) => {   if (error) {      console.log("Something wrong: ", error);      return;   }     console.log(`server is listening on http://${HOST}:${PORT} ...`); });
登錄后復制

淺析用Node創建一個簡單的HTTP服務器


總結

我們學會了:

  • 如何使用Node創建一個http服務器
  • js加上類型提示
  • 如何返回字符串響應體
  • 如何返回html
  • 如何返回JSON
  • 如何生成并返回pdf文件
  • 如何返回音頻文件
  • 如何返回視頻文件

雖然內容簡單,但還是希望你能跟著動手敲一敲,不要以為簡單就看看就算了,看了不代表會了,真正動手實現過后才會找到自己的問題

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
欧美老妇交乱视频在线观看| 日本公妇在线观看中文版| 女人越喊男人越往里寨电视剧| 欧美电影在线观看| 日本在线 | 中文| 挺进绝色老师的紧窄小肉六视频| 性色av蜜臀av色欲av免费| 亚洲国产在一区二区三区| 伊人天天久大香线蕉AV色| AⅤ精品一区二区三区| 波多野无码中文字幕AV专区| 国产92刮伦脏话对白| 国产亚洲日韩AV在线播放不卡| 精品久久人人爽天天玩人人妻 | 国产精品成人影院久久久| 记忆女神的女儿们| 免费无码AV片在线观看潮喷| 日韩精品无码AV中文无码版| 亚洲 欧美 动漫 少妇 自拍| 岳又紧又嫩又多水好爽| 波多野结衣AV影音先锋| 国产乱子影视频上线免费观看| 久久国产精品成人免费| 欧美精品人妻大乳一区二区| 天美传媒在线观看果冻传媒视频| 亚洲精品有码在线观看| 7777久久亚洲中文字幕| 国产成人AV一区二区三区在线观| 精品人妻少妇敕草AV无码专区 | 天天躁狠狠躁狠狠躁夜夜躁 | 精品欧洲AV无码一区二区男男 | 久久国产精品免费一区| 人妻丰满熟妇AV无码区| 性国产VIDEOFREE高清| 在线观看特色大片免费网站| 粉嫩Av网站在线观看| 久久99精品九九九久久婷婷| 人妻中文乱码在线网站| 亚洲AV永久无码精品三区在线4| 2019午夜福利不卡片在线| 国产丰满美女A级毛片| 老公和小三在车上做我想卖了车 | 永久免费AV无码不卡在线观看| 成年美女黄网站18禁免费| 精品无人区麻豆乱码1区2区| 人与畜禽共性关系的重要性有哪些| 亚洲AV成人中文无码专区| AV成人片无码夜色AV大胸| 国产欧美一区二区精品久久久| 免费影视观看网站入口| 午夜无码人妻AⅤ大片色欲李宗瑞| 中文天堂在线最新版在线WWW| 国产精品白丝AV嫩草影院| 免费观看添你到高潮视频| 无码人妻久久一区二区三区 | 精品人妻AV一区二区三区不卡 | 窝窝人体色WWW聚色窝魅惑| 野花影视在线观看免费高清完整版| 敌伦交换第21部分正文内容| 精品无人区一线二线三线区别| 日韩无码视频一区二区三区| 一本加勒比波多野结衣| 国产精品亚洲产品一区二区三区| 能在线观看的一区二区三区| 亚洲AV无码久久久久久精品同性| 办公室撕开奶罩揉吮奶漫画 | 国产精品亚洲А∨天堂免下载| 欧美丰满熟妇人妻兽交视频| 亚洲丰满多毛XXXⅩ熟妇| 成人欧美日韩一区二区三区| 老色鬼永久精品网站| 亚洲 校园 欧美 国产 另类| 波多野无码中文字幕AV专区 | 中文精品无码中文字幕无码专区| 国产精品自产拍在线18禁| 人妻无码一区二区三区久| 一本加勒比HEZYO无码人妻 | 日本丰满妇人成熟免费中文字幕| 一二三四视频社区| 国语精品自产拍在线观看网站| 人人妻人人澡人人爽精品欧美| 玉蒲团Ⅱ之性战奶水潘金莲小说| 国语第一次处破女| 四季亚洲AV无码一区在线观看 | 在线播放人成视频观看| 国产在线无码免费网站永久| 色婷婷粉嫩AV精品综合在线| 2023国产精品一卡2卡三卡| 久久97超碰人人澡人人爱| 午夜内射高潮视频| 丰满人妻跪趴高撅肥臀| 欧美性猛交一区二区三区精品| 野花视频在线观看最新| 经典WC偷窥美女如厕MP4| 无码人妻久久一区二区三区不卡| 菠萝视频高清观看免费6| 女士不遮阴小内搭| 伊人色综合久久天天五月婷 | 人妻[21p]大胆| 99精产国品一二三产区区别在线 | 成人免费无码A毛片| 欧美日韩国产综合草草| 在线人成视频播放午夜福利| 九热爱视频精品视频| 亚洲AV无码国产精品久久不卡| 国产精品成人亚洲777| 少妇高潮叫床在线播放| 成人国产一区二区三区精品不卡| 欧美日韩一区二区三区自拍| 中文字幕视频在线观看| 浪货趴办公桌~H揉秘书电影| 亚洲一区二区三区乱码AⅤ| 精品国产乱码久久久久久人妻| 新X8X8拨牐拨牐永久免费AP| 国产精品欧美一区二区三区不卡| 天堂√最新版中文在线天堂| 丰满少妇弄高潮了WWW| 色婷婷亚洲六月婷婷中文字幕 | 50妺妺窝人体色聚窝窝www| 巨胸喷奶水视频WWW免费动漫| 一本大道久久香蕉成人网| 久久精品国产亚洲77777| 亚洲精品无码久久久久AV老牛 | 一女三黑人玩4P惨叫| 久久久久亚洲AV成人人电影软件 | 午夜精品无人区乱码1区2区| 国产精品亲子乱子伦XXXX裸| 无码人妻视频一区二区三区| 国产精品无码AV无码| 五月婷日韩中文字幕| 国产又色又爽又黄的网站在线| 亚洲AV无码二区鸳鸯影院| 红杏亚洲影院一区二区三区| 亚洲乱码无人区卡1卡2卡3 | 国产又色又爽又刺激在线观看| 亚洲AV极品熟妇一品二品三品 | 色欲老女人人妻综合网| 各种少妇正面着BBW撒尿视频| 我和丰满女教练在线观看| 国产亲子伦ⅩⅩⅩⅩX熟妇| 亚洲AV无码乱码在线观看裸奔 | 爱性久久久久久久久| 日韩人妻无码一区二区三区| 国产成人亚洲综合无码18禁禁| 无码人妻精品一区二区在线视频| 国产无遮挡又黄又爽无VIP| 亚洲精品无码MV在线观看网站 | 中国在线观看免费国语版| 女孩子手脚绑起来嘴用胶带封上| WWW.嫩草AV天堂影院| 少妇被黑人到高潮喷出白浆| 国产精品久久无码一区二区三区网| 性做久久久久久久久| 精品露脸国产偷人在视频| 在厨房拨开内裤进入毛片| 欧美日韩国产成人高清视频| 粉嫩人妻一区二区三区| 小雪第一次交换又粗又大老杨| 精品无码国产一区二区三区AV| 在线天堂中文最新版| 日本高清二区视频久二区| 国产高清在线精品一区二区三区| 亚洲AV综合久久九九| 老妇做爰XXXⅩ性视频| Chinese老女人老熟妇HD| 熟悉妇人妻av无码毛片| 精东传媒VS天美传媒电影| 中文字字幕在线中文无码| 日本少妇人妻XXXXX18| 国产乱女乱子视频在线播放| 亚洲一码和欧洲二码的尺码区别 | 夫妇交换聚会群4P疯狂大战| 亚洲AV无码乱码在线观看性色扶| 理论片午午伦夜理片久久| 成人国产一区二区精品小说| 午夜影视啪啪免费体验区入口| 久久久久亚洲AV成人网| 宝贝把腿张开我要添你下边动态图| 无码精品毛片波多野结衣| 久久精品国产亚洲AVAPP下载| BGMBGMBGM老太太水太多| 无码人妻精品一区二区三区不卡| 久久精品成人欧美大片| ZZTT166.CCM黑料| 性色AⅤ一区二区三区天美传媒| 乱老熟女成熟50ⅩXXX小| 东京热人妻中文无码AV| 亚洲毛片ΑV无线播放一区| 欧美国产成人久久精品| 国产免费久久久久久无码| 曰韩少妇内射免费播放| 少妇人妻无码专区视频免费| 久久精品国产清自在天天线| 被夫上司强迫的女人在线中文| 亚洲AV日韩AV高潮喷潮无码| 女人私密紧致手术视频| 国产性一交一乱一伦一色一情| 2018一本久道在线线观看| 午夜DY888国产精品影院| 欧美变态另类ZOZO|