Node.js全棧指南:靜態資源服務器

陳隨易

上一章【認識 MIME 和 HTTP】。

我們認識和了解了 MIME 的概念和作用,也簡單地學習了通過瀏覽器控制臺查看請求和返回的用法。

通過對不同的 HTML、CSS、JS 文件進行判斷,設置不同的 MIME 值,得以讓我們的瀏覽器正正確地接收和顯示不同的文件內容,渲染出正確的效果。

但真實場景中,遠遠不止這三種類型的文件,用成百上千來形容也不為過。

picture 0

上圖是一個開源的項目,地址是 https://github.com/jshttp/mime-db。

該項目對所有文件類型的擴展名和 MIME 類型進行了映射。

知道文件擴展名,就能找到對應的 MIME 類型。

知道 MIME 類型,就能知道哪些文件擴展名可以匹配。

但是,也正如它的倉庫名字 “mime-db” 所表達的,它是一個映射庫。

也就是說,它只是提供了一堆數據,具體如何實現根據擴展名獲取 MIME 類型,那得用到另外一個開源項目 https://github.com/jshttp/mime-types。

picture 1

從截圖中就能看到相關的文字說明,這個項目依賴了 mime-db 項目。而且,這 2 個項目是同一批作者。

mime-types 提供了多個方法,比較常用的就是 lookup 方法,根據文件擴展名,返回對應的 MIME 值。

目前,這 2 個項目在 npm 平臺的周下載量,均在 5 千萬次以上,眾多知名項目都依賴于這 2 個項目。在 github 上,有 3 千多萬個倉庫依賴了 mime-types。

而現在,我們的 web 服務器也將使用 mime-types 完成我們今天的主題:靜態資源服務器。

實現靜態資源服務器

picture 2

在用 mime-types 之前呢,首先要安裝這個依賴,請看上圖:

在 (1) 處安裝,(2) 處的 package.json 文件中就有這個依賴了。

下一步呢,就在我們的項目中用起來。

picture 3

這里涉及到幾個步驟,一一說明下。

首先呢,當我們直接在瀏覽器端輸入 http://127.0.0.1:3000 訪問的時候,請求的 url 值是 “/”。

沒有任何擴展名,也沒有文件名,服務器遇到這種情況怎么辦呢?總不能什么也不返回吧,那么我們的 WEB 服務器探索之路就到此終止了。

市面上的 WEB 服務器,比如 Apache、Nginx、Caddy、Tomcat。或者 Node.js 中的 Koa、Express、Fastify 等等。一般都會對這種靜態文件服務器的 “根” 請求,返回默認的 index.html 文件。

我們這里也不例外,如果是 “根 (/)” 請求,就把請求內容改成 index.html。

其次呢,根據我們請求的資源,通過我們上面說到過的,mime-types 依賴的 lookup 函數,去獲取該文件對應的 MIME 值,設置給返回數據的請求頭中的 Content-Type 屬性。

如果對這個設置頭部屬性印象模糊了,請看前面章節內容。

最后呢,再通過 readFileSync 文件讀取函數,獲取對應的請求文件內容,返回給瀏覽器。

picture 4

那么經過這么一操作,我們的代碼量不僅減少了,程序也更健壯了,支持的文件類型也更多了,可以不加多余的代碼邏輯,就能顯示不同的資源了。

當然,目前的功能,距離真正的流行的 Web 框架還差得遠,同時正如前文所說,本小冊分為兩大部分。

第一大部分,是通過一個 Web 服務器的誕生,來進一步理解其工作流程。

第二大部分,就是通過我們這個 Web 服務器,來寫一個全棧的個人博客項目。

這樣,我們就能夠掌握 Node.js 全棧開發的秘訣,不管是后面使用其他 Web 框架,還是自己寫一個前后端一體化的全棧產品,都會更加輕松了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37118.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37118.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37118.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

八爪魚現金流-031,寬帶到期記一筆負債

到期了,新弄的網絡,記錄一下負債包。 八爪魚現金流 八爪魚

英英詞典(匯編實驗)

功能要求: 1.單詞及其英文解釋的錄入、修改和刪除 (1 ) 錄入新單詞,把它插入到相應的位置(按詞典順序),其后跟英文解釋、同義詞、反義詞;(此功能要求在文件中完成,其它功能可以將單詞放在數據段中&#xf…

數據庫原理之數據庫基本概念

目錄 前言 基本概念 數據庫完整性 前言 今天我們來看看數據庫的基本概念,幫助大家對數據庫有一點點最基本的了解 基本概念 4個基本概念 數據data:描述事物的符號,數據庫中存儲的基本對象。 數據庫Database:長期存儲在計算機…

山東大學多核并行2024年回憶版

2024.6.13回憶版 矩陣向量乘不可整除代碼 集合通信與點對點通信的區別 塊劃分、循環劃分、循環塊劃分(14個向量,4個進程) 按行訪問還是按列訪問快 SISD系統問題 循環依賴問題 問題:為什么不能對這個循環并行化&#xff0…

Python邏輯控制語句 之 綜合案例

需求: 1. 提示?戶輸?登錄系統的?戶名和密碼 2. 校驗?戶名和密碼是否正確(正確的?戶名:admin、密碼:123456) 3. 如果?戶名和密碼都正確,打印“登錄成功!”,并結束程序 4. 如果?戶名或密碼錯誤,打印“?戶名或密碼錯誤!”…

Django 對模型創建的兩表插入數據

1,添加模型 Test/app8/models.py from django.db import modelsclass User(models.Model):username models.CharField(max_length50, uniqueTrue)email models.EmailField(uniqueTrue)password models.CharField(max_length128) # 使用哈希存儲密碼first_name …

代碼隨想錄算法訓練營第一天 [300.最長遞增子序列 674. 最長連續遞增序列 718. 最長重復子數組]

代碼隨想錄算法訓練營第一天 [300.最長遞增子序列 674. 最長連續遞增序列 718. 最長重復子數組] **一、300.最長遞增子序列 ** 鏈接: 代碼隨想錄. 思路:dp[i] 以nums[i]為結尾的遞增子序列最大長度,下標為i的數,需要和下標為0開始一直到下標為…

DM 的斷點續傳測試

作者: 大魚海棠 原文來源: https://tidb.net/blog/4540ae34 一、概述 DM有all、full、incremental三種數據遷移同步方式(task-mode),在all同步模式下,因一些特殊情況,需要變更上游MySQL的數…

LDO產品的基礎知識解析

低壓降穩壓器 (LDO)是一種用于調節較高電壓輸入產生的輸出電壓的簡單方法。在大多數情況下,低壓降穩壓器都易于設計和使用。然而,如今的現代應用都包括各種各樣的模擬和數字系統,而有些系統和工作條件將決定哪種LDO最適合相關電路&#xff0c…

鄧普頓的五大投資原則

在《逆向投資 鄧普頓的長贏投資法》的推薦序《“逆向投資大神”鄧普頓五大投資原則》中,劉建位總結了鄧普頓的五大投資原則,分別是“以逆向投資為中心”“以價值投資為選股根本”“以分散投資為組合穩定器”“以全球投資來擴大機會池”“以極度悲觀點投資…

rust單元測試順序執行

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站。 存在的問題 有時候,不同單元測試之間可能會競爭相同的資源,比如讀寫相同的文件。在這種情況下,如果…

springboot的特點是什么?

Spring Boot是一個基于Spring框架的開源項目,它旨在簡化Spring應用的初始搭建和開發過程。以下是Spring Boot的一些主要特點: 快速開發: Spring Boot提供了許多默認配置,使得開發者可以更快地開始開發應用程序,而無需…

秋招突擊——6/28、6.29——復習{數位DP——度的數量}——新作{}

文章目錄 引言復習數位DP——度的數量個人實現參考實現 總結 引言 頭一次產生了那么強烈的動搖,對于未來沒有任何的感覺的,不知道將會往哪里走,不知道怎么辦。可能還是因為實習吧,再加上最近復習也沒有什么進展,并不知…

Vmware Windows虛擬機卡死了

每次遇到這個問題我都想罵娘!!!! 這一次是怎么解決的呢? 解決:我給虛擬機連上網就好了! 重啟,開關機,一點用都沒有。

前端 JS 經典:箭頭函數的意義

箭頭函數是為了消除函數的二義性。 1. 二義性 函數的二義性指函數有不同的兩種用法,就造成了二義性,函數的兩種用法:1. 指令序列。2. 構造器 1.1 指令序列 就是調用函數,相當于將函數內部的代碼再從頭執行一次。 1.2 構造器 …

【Linux 工具 】 tcpdump詳細使用說明

目錄 1. 安裝 tcpdump 2. 使用 tcpdump 命令 3. 監聽所有網絡接口 4. 監聽指定網絡接口 5. 保存數據包到文件 6. 讀取保存的數據包文件 7. 過濾數據包 過濾源 IP 地址: 過濾目標 IP 地址: 過濾源和目標 IP 地址: 過濾指定端口: 過濾指定協議: 8. 顯示數據包詳…

爬蟲實戰:使用PHP爬取攜程旅游信息

隨著旅游業的不斷發展,旅游信息變得非常豐富。為了方便大家獲取更全面、準確的旅游信息,我們可以使用爬蟲來抓取旅游網站上的數據,并進行分析和處理。本文將介紹如何使用php爬取攜程旅游信息。 爬蟲基礎知識 爬蟲是一種自動化程序&#xff…

Android SurfaceFlinger——OpenGL ES基礎介紹(十二)

前面的文章我們介紹了 HWC,知道他在 Android 系統中用于硬件加速屏幕合成的一個組件。負責將多個 Surface(包括那些可能通過 OpenGL ES 渲染的內容)合成到一起,并輸出到屏幕。HWC 利用底層硬件(如 GPU)來執行合成操作,減少 CPU 的負擔,提高效率和電池壽命。 一、概述 …

如何借助 LLM 設計和實現任務型對話 Agent

1 引言 在人工智能的快速發展中,任務型對話 Agent 正成為提升用戶體驗和工作效率的關鍵技術。這類系統通過自然語言交互,專注于高效執行特定任務,如預訂酒店或查詢天氣。盡管市場上的開源框架如 Rasa 和 Microsoft Bot Framework 在對話理解…