結合GET(),POST()實現一個簡單、完整的伺服器

来源:http://www.cnblogs.com/n2meetu/archive/2017/11/15/7837600.html
-Advertisement-
Play Games

複習一下: | 基礎模塊 | 作用 | | | | | fs | fs模塊用於對系統文件及目錄進行讀寫操作 | | http | 創建伺服器。e.g.http.createServer(); | | queryString | 把url帶的參數串轉化為數組對象 | | url | 直接解析URL中字 ...


複習一下:

基礎模塊 作用
fs fs模塊用於對系統文件及目錄進行讀寫操作
http 創建伺服器。e.g.http.createServer();
queryString 把url帶的參數串轉化為數組對象
url 直接解析URL中字元串,提煉出我們需要的結果。
提示:
    querystring主要用來解析POST數據(如‘querystring.parse()’)
    Url主要用來解析GET數據(比如‘url.parse()’)。
    
1.url.parse()方法回顧:
 var url = require('url');
 var queryUrl = "http://localhost:8888/bb?name=bigbear&memo=helloworld" 
 console.log(url.parse(queryUrl)) ;

運行結果:

{ 
    protocol: 'http:',
    slashes: true,
    auth: null,
    host: 'localhost:8888',
    port: '8888',
    hostname: 'localhost',
    hash: null,
    search: '?name=bigbear&memo=helloworld',
    query: 'name=bigbear&memo=helloworld',
    pathname: '/bb',
    path: '/bb?name=bigbear&memo=helloworld',
    href: 'http://localhost:8888/bb?name=bigbear&memo=helloworld'
}

說明:

query: 查詢字元串中的參數部分(問號後面部分字元串),或者使用 querystring.parse() 解析後返回的對象。

2.querystring.parse()方法回顧

QueryString" 模塊用於實現URL參數字元串與參數對象的互相轉換
在url.parse()基礎上,把參數字元串編程jsonp對象格式:

例子:

思路:

一、首先,我們確定一下介面。
/user?act=reg&user=aaa&pass=123456
  {"ok": false, "msg": "原因"}

/user?act=login&user=aaa&pass=123456
  {"ok": true, "msg": "原因"}
二、 文件位置:

三、伺服器接受數據後,處理並返回data的思路
  1. 介面名為user。如果url中地址不指向user,就顯示404,否則進入2;
  2. 用戶是登錄還是註冊?
  3. 如果既不是註冊也不是登錄。就提示“未知action”;
    4.“登錄部分”接下去是如果密碼正確,就提示“登錄成功”,否則提示“密碼不正確”;
    如果是註冊,檢測賬號是否存在,也進行相應的提示。
const http = require('http');
const fs = require('fs');
const querystring = require('querystring');
const urlLib = require('url');

var users = {}; //將註冊信息保存在緩存中

var server = http.createServer(function (req, res) {
    // 解析數據    
    var str = '';
    req.on("data", function (data) {
        str += data;
    });
    req.on("end", function () {
        var obj = urlLib.parse(req.url, true);

        var url = obj.pathname;
        const GET = obj.query;
        const POST = querystring.parse(url);

        // 區分介面和文件讀取
        if (url == '/user') { //讀取‘url’介面下的文件時
            switch (GET.act) {
                case 'reg':
                    //用戶名已經存在 
                    if (users[GET.user]) {
                        res.write('{"ok":false, "msg":"已經註冊過了!"}');
                    } else {
                        // 插入到users
                        users[GET.user] = GET.pass;
                        res.write('{"ok":true,"msg":"註冊成功!"}');
                    }
                    break;
                case 'login':
                    //用戶名是否存在
                    if (users[GET.user]) {
                        if (user[GET.pass] === GET.pass) { //密碼是否正確
                            res.write('{"ok":true,"msg":"登錄成功!"}');
                        } else {
                            res.write('{"ok":flase,"msg":"密碼不正確!"}');
                        }
                    } else { //用戶名不存在
                        res.write('{"ok":false,"msg":"用戶名不存在"}');
                    }
                    break;
                default:
                    res.write('{"ok":false,"msg":"未知操作"}');
            }
            res.end();
        } else { //讀取別的文件
            var file_name = './www' + url;
            fs.readFile(file_name, function (err, data) {
                if (data) {
                    res.write(data);
                } else {
                    res.write("404");
                }
                res.end();
            });
        }
    });
});

server.listen(8080);

user.html文件代碼:

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title></title>
  <!--引入jQuery文件-->
  <script src="ajax.js" charset="utf-8"></script>
  
  <!--我們需要的js代碼-->
  <script type="text/javascript">
    window.onload = function () {
      var oTxtUser = document.getElementById('user');
      var oTxtPass = document.getElementById('pass');
      var oBtnReg = document.getElementById('reg_btn');
      var oBtnLogin = document.getElementById('login_btn');

      oBtnLogin.onclick = function () {
        ajax({
          url: '/user',
          data: {
            act: 'login',
            user: oTxtUser.value,
            pass: oTxtPass.value
          },
          type: 'get',
          success: function (str) {
            var json = eval('(' + str + ')');

            if (json.ok) {
              alert('登錄成功');
            } else {
              alert('登錄失敗:' + json.msg);
            }
          },
          error: function () {
            alert('通信錯誤');
          }
        });
      };

      oBtnReg.onclick = function () {
        ajax({
          url: '/user',
          data: {
            act: 'reg',
            user: oTxtUser.value,
            pass: oTxtPass.value
          },
          type: 'get',
          success: function (str) {
            var json = eval('(' + str + ')');

            if (json.ok) {
              alert('註冊成功');
            } else {
              alert('註冊失敗:' + json.msg);
            }
          },
          error: function () {
            alert('通信錯誤');
          }
        });
      };
    };
  </script>
</head>

<body>
  用戶:
  <input type="text" id="user">
  <br> 密碼:
  <input type="password" id="pass">
  <br>
  <input type="button" value="註冊" id="reg_btn">
  <input type="button" value="登錄" id="login_btn">
</body>

</html>

執行以下server.js,然後在瀏覽器中打開user.html頁面。值得註意的是跨域問題,

註意:我們應該在伺服器上跑,而不是只打開本地靜態頁面!

接下來就正常玩耍吧……


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、關於Docker 什麼是Docker?Docker 採用go語言編寫,是一個開源的應用容器引擎。讓開發者可以快速打包他們的應用以及依賴包到一個封裝的可移植的容器Image中,然後發佈到任何流行的機器( Linux ,windows,Mac等)上,也可以實現虛擬化。容器是使用完全獨立的沙箱機制,相 ...
  • package ty; abstract class A { public abstract void fun(); }; package ty; class B extends A { public void fun() { System.out.println("what is your nam... ...
  • 介紹 釘釘,阿裡巴巴出品,專為中國企業打造的免費智能移動辦公平臺,含PC版,Web版和手機版。智能辦公電話,消息已讀未讀,DING消息任務管理,讓溝通更高效;移動辦公考勤,簽到,審批,企業郵箱,企業網盤,企業通訊錄,讓工作更簡單;酷公司,用釘釘,隨時隨地移動辦公。 由於目前的版本郵件警報暫時走不通, ...
  • 負載均衡集群企業級應用實戰-LVS 實現基於LVS負載均衡集群的電商網站架構 隨著業務的發展,網站的訪問量越來越大,網站訪問量已經從原來的1000QPS,變為3000QPS,網站已經不堪重負,響應緩慢,面對此場景,單純靠單台LNMP的架構已經無法承載更多的用戶訪問,此時需要用負載均衡技術,對網站容量 ...
  • 恢復內容開始 設計模式(design patterns)是一套被反覆使用,多數人知曉的,經過分類編目的,使用設計模式是 為了可重用代碼,讓代碼更容易更容易被他人理解,保證代碼可靠性。 設計模式一共有23種: 1. 設計者模式分類 (三大類) 創建者模式: 一共分5種 工廠方法模式 , 抽象工廠模式, ...
  • CDN的全稱是Content Delivery Network,即內容分髮網絡。 其基本思路是儘可能避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定。通過在網路各處放置節點伺服器所構成的在現有的互聯網基礎之上的一層智能虛擬網路,CDN系統能夠實時地根據網路流量和... ...
  • 題目1:通過代碼描述每一天的不同時間段的工作效率 分析: 首先確定,工作狀態指正在工作,或者以及下班這些情況,而這些情況所受影響的因素包括:當前時間以及任務是否已經完成。所以在Work中需要兩個屬性:hour和finish。然後根據這兩個屬性直接判斷當前的工作狀態即可。 實現: 1 class Pr ...
  • 1. 什麼是領域(Domain) 我們所做的軟體系統的目的都是來解決一系列問題,例如做一個電商系統來線上銷售自己企業的產品;做一個灰度發佈平臺來提升服務的質量和穩定性。任何一個系統都會屬於某個特定的領域,例如: 論壇是一個領域:要做一個論壇,那這個論壇的核心業務是確定的:比如用戶發帖、回帖等核心基本 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...