最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Node.js服務(wù)器靜態(tài)資源處理

 更新時(shí)間:2024年04月25日 14:37:25   作者:想想aw  
靜態(tài)資源服務(wù)器指的是不會(huì)被服務(wù)器的動(dòng)態(tài)運(yùn)行所改變或者生成的文件,本文主要為大家詳細(xì)介紹了Node.js服務(wù)器靜態(tài)資源處理的相關(guān)知識(shí),需要的可以了解下

前言:

node.js服務(wù)器動(dòng)態(tài)資源處理見 一文詳解Node.js服務(wù)器動(dòng)態(tài)資源處理

一、什么是node.js服務(wù)器靜態(tài)資源

靜態(tài)資源服務(wù)器指的是不會(huì)被服務(wù)器的動(dòng)態(tài)運(yùn)行所改變或者生成的文件. 它最初在服務(wù)器運(yùn)行之前是什么樣子, 到服務(wù)器結(jié)束運(yùn)行時(shí), 它還是那個(gè)樣子. 比如平時(shí)寫的 js, css, html文件, 都可以算是靜態(tài)資源。

我的靜態(tài)服務(wù)器需要使用json文件作為數(shù)據(jù)存儲(chǔ)。并進(jìn)行json數(shù)據(jù)的讀取與寫入。

下面,我將以在服務(wù)器中實(shí)現(xiàn)注冊(cè)、登錄為例并將我已注冊(cè)的用戶數(shù)據(jù)寫到我的user.json中。

二、服務(wù)器處理靜態(tài)資源執(zhí)行思路

(1)將所有靜態(tài)資源統(tǒng)一放入一個(gè)文件夾中做統(tǒng)一處理

(2)在服務(wù)器端來處理pathname從而判斷url是否是我們請(qǐng)求的路徑

如何解析和格式化url查詢字符串?

 Node.js 的 querystring 模塊:

1. 將字符串參數(shù)解析成對(duì)象

querystring.parse(url)

2. 將對(duì)象參數(shù)解析成字符串

querystring.stringify(urlObject)

三、靜態(tài)資源處理的判斷方法

startWith(以什么開頭)、indexOf、search、includes

四、執(zhí)行要求

靜態(tài)資源要求:完成注冊(cè)、登錄功能

動(dòng)態(tài)資源要求:完成注冊(cè)、登錄、已注冊(cè)的用戶列表展示功能

五、執(zhí)行代碼

node.js服務(wù)器靜態(tài)資源處理

(1)我們將首頁、登錄、注冊(cè)三個(gè)html靜態(tài)頁面和用戶列表users.html寫在views這個(gè)大文件夾下。css樣式和images圖片放入public這個(gè)大文件夾下。創(chuàng)建一個(gè)data大文件夾,data下面建一個(gè)users.json文件來專門存儲(chǔ)用戶數(shù)據(jù)

簡(jiǎn)單寫一下首頁、注冊(cè)、登錄頁面的html靜態(tài)頁面的樣式。

index.html 首頁

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>首頁</title>
  <link rel="stylesheet" href="../public/css/main.css" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
</head>
<body>
  <h1>首頁</h1>
  <img src="../public/images/01.png" alt=""><br>
  <a href="/login" rel="external nofollow" >登錄</a>|<a href="/regist" rel="external nofollow" >注冊(cè)</a>|<a href="/list" rel="external nofollow" >用戶列表</a>
</body>
</html>

regist.html  注冊(cè)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>注冊(cè)</title>
  <link rel="stylesheet" href="../public/css/main.css" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
</head>
<body>
  <h1>注冊(cè)</h1>
  <img src="../public/images/01.png" alt=""><br>
  <form method="get" action="/doRegist">
    <input type="text" name="username" placeholder="用戶名"><br>
    <input type="password" name="password" placeholder="密碼"><br>
    <input type="submit" value="注冊(cè)"><br>
  </form>
</body>
</html>

login.html 登錄

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>登錄</title>
  <link rel="stylesheet" href="../public/css/main.css" rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
</head>
<body>
  <h1>登錄</h1>
  <img src="../public/images/01.png" alt=""><br>
  <form method="get" action="/doLogin">
    <input type="text" name="username" placeholder="用戶名"><br>
    <input type="password" name="password" placeholder="密碼"><br>
    <input type="submit" value="登錄"><br>
  </form>
</body>
</html>

index.html 首頁顯示如下:

(2)測(cè)試代碼:

創(chuàng)建一個(gè)服務(wù)器,使服務(wù)器做出響應(yīng)的請(qǐng)求與響應(yīng)(重點(diǎn):對(duì)解析后的url的pathname來做出不同的if判斷處理)

const http = require('http');
const fs = require('fs');
const path = require('path');
const url = require('url');
// 聲明一個(gè)專門存放所有用戶的變量
var users;
// 導(dǎo)入查詢參數(shù)的模塊
const querystring = require('querystring')
//創(chuàng)建服務(wù)器
const server = http.createServer();
//讀取文件。讀取user.json存放用戶數(shù)據(jù)的文件
fs.readFile(path.join(__dirname, 'data/users.json'), (err, data) => {
    if (err) {
        users = {};
    } else {
        users = JSON.parse(data.toString()); //如果讀取正確就將讀到的內(nèi)容轉(zhuǎn)換為一個(gè)對(duì)象存到users里
    }
})
//服務(wù)器做出請(qǐng)求響應(yīng)
// 設(shè)置服務(wù)器的監(jiān)聽器來響應(yīng)'request'事件。當(dāng)有人向服務(wù)器發(fā)送請(qǐng)求時(shí),這個(gè)事件就會(huì)被觸發(fā)
server.on('request', (req, res) => {
    let objurl = url.parse(req.url); //將包含了客戶端請(qǐng)求的完整URL(req.url)轉(zhuǎn)為一個(gè)對(duì)象才能獲取到它的pathname
    let pathname = objurl.pathname;  //從解析后的URL對(duì)象objurl中提取出路徑名
    // 對(duì)pathname做處理
    if (pathname.startsWith('/public')) {
        // 找到當(dāng)前項(xiàng)目文件夾,再將相對(duì)路徑轉(zhuǎn)為絕對(duì)路徑
        let p = path.join(__dirname, pathname);
        fs.readFile(p, (err, data) => {
            if (err) {
                res.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' });
                res.end('404 Not Found');
            } else {
                res.end(data);
            }
        })
    } else if (pathname == '/' || pathname == '/home') {
        let p = path.join(__dirname, 'views/index.html');
        fs.readFile(p, (err, data) => {
            if (err) {
                res.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' });
                res.end('404 Not Found');
            } else {
                res.end(data);
            }
        })
    } else if (pathname == '/regist') {
        let p = path.join(__dirname, 'views/regist.html');
        fs.readFile(p, (err, data) => {
            if (err) {
                res.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' });
                res.end('404 Not Found');
            } else {
                res.end(data);
            }
        })
 
    } else if (pathname == '/login') {
        let p = path.join(__dirname, 'views/login.html');
        fs.readFile(p, (err, data) => {
            if (err) {
                res.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' });
                res.end('404 Not Found');
            } else {
                res.end(data);
            }
        })
//已注冊(cè)或已登錄的情況:
    } else if (pathname == '/doRegist') {
        let query = querystring.parse(objurl.query); //將字符串參數(shù)解析成對(duì)象
        let username = query.username;
        let password = query.password;
        if (users[username]) {
            res.writeHead(500, { 'Content-Type': 'text/html;charset=utf-8' });
            res.end('用戶名已存在,不能注冊(cè)!');
        } else {
            //因?yàn)閡sers里面是一個(gè)對(duì)象。所以只能屬性名=值的形式。故用戶名 / 密碼 為屬性名 = 用戶名的值 / 密碼的值 為屬性值
            users[username] = password;
            //利用JSON.stringify(users)將users對(duì)象轉(zhuǎn)為字符串重新寫到文件里去
            fs.writeFile(path.join(__dirname, 'data/users.json'), JSON.stringify(users), (err) => {
                if (err) {
                    res.writeHead(502, { 'Content-Type': 'text/html;charset=utf-8' });
                    res.end('注冊(cè)失敗');
                } else {
                    res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });
                    res.end('注冊(cè)成功')
                }
            })
 
        }
 
    } else if (pathname == '/doLogin') {
        let query = querystring.parse(objurl.query);
        let username = query.username;
        let password = query.password;
        // 判斷users的用戶名和密碼有無
        if (users[username] && users[username] == password) { //用戶名 && 密碼
            res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });
            res.end('登錄成功');
        } else {
            res.writeHead(502, { 'Content-Type': 'text/html;charset=utf-8' });
            res.end('用戶名或密碼錯(cuò)誤,登錄失敗');
        }
    } else if (pathname == '/list') {
//顯示list用戶列表是動(dòng)態(tài)資源處理的內(nèi)容。見我的下一篇博客 
    }
});
//啟動(dòng)服務(wù)器
server.listen(3000, '127.0.0.1', () => {
    console.log('Server is running at http://127.0.0.1:3000');
})

(3)結(jié)果顯示

此時(shí)我的用戶數(shù)據(jù)就顯示在了我的data文件夾下的user.json上了

以上就是詳解Node.js服務(wù)器靜態(tài)資源處理的詳細(xì)內(nèi)容,更多關(guān)于Node.js服務(wù)器靜態(tài)資源處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • mac下徹底卸載node和npm方法步驟

    mac下徹底卸載node和npm方法步驟

    我們經(jīng)常在卸載軟件的時(shí)候會(huì)遇到有殘留,這樣就很難去重新下載,本篇文章就來介紹mac下徹底卸載node和npm及重新安裝的方法,有需要的朋友可以借鑒參考下
    2021-09-09
  • nodejs 搭建簡(jiǎn)易服務(wù)器的圖文教程(推薦)

    nodejs 搭建簡(jiǎn)易服務(wù)器的圖文教程(推薦)

    下面小編就為大家?guī)硪黄猲odejs 搭建簡(jiǎn)易服務(wù)器的圖文教程(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • node中實(shí)現(xiàn)刪除目錄的幾種方法

    node中實(shí)現(xiàn)刪除目錄的幾種方法

    這篇文章主要介紹了node中實(shí)現(xiàn)刪除目錄的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 使用node.js實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)進(jìn)行CRUD操作

    使用node.js實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)進(jìn)行CRUD操作

    這篇文章主要為大家詳細(xì)介紹了如何使用node.js實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)進(jìn)行CRUD(增刪改查)操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下
    2024-12-12
  • node.js利用redis數(shù)據(jù)庫(kù)緩存數(shù)據(jù)的方法

    node.js利用redis數(shù)據(jù)庫(kù)緩存數(shù)據(jù)的方法

    Redis數(shù)據(jù)庫(kù)采用極簡(jiǎn)的設(shè)計(jì)思想,最新版的源碼包還不到2Mb。其在使用上也有別于一般的數(shù)據(jù)庫(kù)。下面這篇文章就來給大家介紹了node.js利用redis數(shù)據(jù)庫(kù)緩存數(shù)據(jù)的方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • Node.js中的不安全跳轉(zhuǎn)如何防御詳解

    Node.js中的不安全跳轉(zhuǎn)如何防御詳解

    安全是不容忽視的,每個(gè)開發(fā)者都知道它非常重要,真正嚴(yán)肅對(duì)待它的卻沒有幾人。下面這篇文章主要給大家介紹了關(guān)于Node.js中不安全跳轉(zhuǎn)如何防御的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì)。需要的朋友可以參考下
    2018-10-10
  • node.js+npm安裝配置的完整流程記錄

    node.js+npm安裝配置的完整流程記錄

    npm是 Nodejs 下的包管理器,在下載Node.js后自動(dòng)安裝,這篇文章主要介紹了node.js+npm安裝配置的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2025-06-06
  • node.js文件系統(tǒng)模塊和兩個(gè)重要模塊

    node.js文件系統(tǒng)模塊和兩個(gè)重要模塊

    這篇文章主要介紹了node.js文件系統(tǒng)模塊和兩個(gè)重要模塊,nodejs是JavaScript的后端運(yùn)行環(huán)境,并對(duì)node.js的fs文件系統(tǒng)模塊做了簡(jiǎn)單的介紹,需要的小伙伴可以參考一下
    2022-06-06
  • yarn的安裝及使用詳解

    yarn的安裝及使用詳解

    Yarn 就是一個(gè)類似于 npm 的包管理工具,它是由 facebook 推出并開源,與 npm 相比,yarn 有著眾多的優(yōu)勢(shì),主要的優(yōu)勢(shì)在于:速度快、離線模式、版本控制,這篇文章主要介紹了yarn的安裝及使用教程,需要的朋友可以參考下
    2022-08-08
  • Node.js插件的正確編寫方式

    Node.js插件的正確編寫方式

    正如Node.js在官方說明文檔中所言,插件是以動(dòng)態(tài)方式進(jìn)行鏈接的共享式對(duì)象,能夠?qū)avaScript代碼與C/C++庫(kù)接駁起來。這意味著我們可以引用任何來自C/C++庫(kù)中的內(nèi)容,并通過創(chuàng)建插件的方式將其納入到Node.js當(dāng)中。
    2014-08-08

最新評(píng)論

宁海县| 都江堰市| 澄江县| 江永县| 夹江县| 合水县| 西畴县| 佳木斯市| 海口市| 桓仁| 南涧| 昭觉县| 桃园县| 灌阳县| 鹰潭市| 祁门县| 大厂| 甘孜| 田东县| 鸡东县| 昭觉县| 霍州市| 武陟县| 阿图什市| 德令哈市| 西安市| 汤阴县| 稻城县| 民丰县| 阿鲁科尔沁旗| 依兰县| 米林县| 郴州市| 博乐市| 庄河市| 原阳县| 武穴市| 越西县| 罗平县| 松江区| 阜阳市|