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

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

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

前言:

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

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

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

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

下面,我將以在服務器中實現注冊、登錄為例并將我已注冊的用戶數據寫到我的user.json中。

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

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

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

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

 Node.js 的 querystring 模塊:

1. 將字符串參數解析成對象

querystring.parse(url)

2. 將對象參數解析成字符串

querystring.stringify(urlObject)

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

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

四、執(zhí)行要求

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

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

五、執(zhí)行代碼

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

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

簡單寫一下首頁、注冊、登錄頁面的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" >注冊</a>|<a href="/list" rel="external nofollow" >用戶列表</a>
</body>
</html>

regist.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="/doRegist">
    <input type="text" name="username" placeholder="用戶名"><br>
    <input type="password" name="password" placeholder="密碼"><br>
    <input type="submit" value="注冊"><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)測試代碼:

創(chuàng)建一個服務器,使服務器做出響應的請求與響應(重點:對解析后的url的pathname來做出不同的if判斷處理)

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

(3)結果顯示

此時我的用戶數據就顯示在了我的data文件夾下的user.json上了

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

相關文章

  • 使用Node.js搭建Web服務器

    使用Node.js搭建Web服務器

    這篇文章介紹了使用Node.js搭建Web服務器的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • node.js使用Moment.js js 時間計算方法示例小結

    node.js使用Moment.js js 時間計算方法示例小結

    這篇文章主要介紹了node.js使用Moment.js js 時間計算方法,結合實例形式分析了Moment.js js模塊時間計算的常用操作技巧與相關注意事項,需要的朋友可以參考下
    2023-05-05
  • nodejs實現百度輿情接口應用示例

    nodejs實現百度輿情接口應用示例

    這篇文章主要介紹了nodejs實現百度輿情接口應用,結合實例形式分析了node.js調用百度輿情接口的具體使用技巧,需要的朋友可以參考下
    2020-02-02
  • Nodejs異步回調的優(yōu)雅處理方法

    Nodejs異步回調的優(yōu)雅處理方法

    這篇文章主要介紹了Nodejs異步回調的優(yōu)雅處理方法,本文使用了ES6中的新特性,用一種十分優(yōu)雅的方式解決了回調問題,需要的朋友可以參考下
    2014-09-09
  • 使用nodejs+express實現簡單的文件上傳功能

    使用nodejs+express實現簡單的文件上傳功能

    這篇文章主要介紹了使用nodejs+express完成簡單的文件上傳功能,需要的朋友可以參考下
    2017-12-12
  • Node.js Buffer模塊功能及常用方法實例分析

    Node.js Buffer模塊功能及常用方法實例分析

    這篇文章主要介紹了Node.js Buffer模塊功能及常用方法,結合實例形式分析了Buffer模塊的各種常用函數及相關使用技巧,需要的朋友可以參考下
    2019-01-01
  • 使用Typescript和ES模塊發(fā)布Node模塊的方法

    使用Typescript和ES模塊發(fā)布Node模塊的方法

    這篇文章主要介紹了使用Typescript和ES模塊發(fā)布Node模塊的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • node.js中的fs.readdir方法使用說明

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

    這篇文章主要介紹了node.js中的fs.readdir方法使用說明,本文介紹了fs.readdir方法說明、語法、接收參數、使用實例和實現源碼,需要的朋友可以參考下
    2014-12-12
  • 掌握Node.js中的Promise異步編程方式

    掌握Node.js中的Promise異步編程方式

    Node.js中的Promise是一種異步編程方式,可以解決回調地獄問題,提高代碼可讀性和可維護性。通過掌握Promise的使用方法,可以更好地進行異步編程,避免一些常見的錯誤和陷阱
    2023-05-05
  • 一文帶你了解前端包管理工具npm、yarn和pnpm

    一文帶你了解前端包管理工具npm、yarn和pnpm

    如果您是前端開發(fā)人員,您將接觸到一些包管理工具,包管理工具是連續(xù)自動化程序的集合,例如安裝、升級、配置和刪除程序,下面這篇文章主要給大家介紹了關于前端包管理工具npm、yarn和pnpm的相關資料,需要的朋友可以參考下
    2022-05-05

最新評論