Nodejs 瞭解web服務器

一臺電腦他可以部署很多個服務器

  • apache軟件部署的服務器
  • 我們自己用http模塊搭建的服務器
  • mysq|數據庫服務器

那我們通過ip地址(本地迴環地址127.0.0.1/localhost)找到這個電腦了通過端口來區分不同的服務器.

注意:

  • 默認的http端口是80端口,所以apache配置這個web服務器用的就是這個默認的80端口.
  • 默認的80端口可以省略不寫.
  • 自己寫的服務器端口也不要亂寫,很多端口已經被其他的服務給佔用了.

web服務器讀取網頁返回給用戶

// 1. 導入模塊
const fs = require("fs");
const http = require("http");
const path = require("path");
// 2. 創建web服務器
const server = http.createServer((request, response) => {
  // 3. 讀文件返回
  // 3.1 拼接妖譜讀取的文件路徑
  const fullPath = path.join(__dirname, "web", "index.html");
  // 3.2 讀取這個文件的內容
  fs.readFile(fullPath, "utf-8", (err, data) => {
    if (err == null) {
      response.end(data);
    } else {
      console.log("404");
    }
  });
});
// 4. 開啓服務器
server.listen(4399, () => {
  console.log("success");
});

staticServer

在這裏插入圖片描述

// 1. 導入模塊
const fs = require("fs");
const http = require("http");
const path = require("path");

// 2. 創建服務器
const server = http.createServer((request, response) => {
  // 3. 設置返回給用戶的內容
  // 3.1 首先你要知道用戶請求的是那樣一個頁面(哪一個資源)
  console.log(request.url);
  // response.end("666");

  // 3.2 拼接要讀取文件的路徑
  const fullPath = path.join(__dirname, "web", request.url);

  // 3.3 讀取這個文件
  // 服務器會有一個嗅探功能
  // 它根據你請求的資源名字,能夠知道你請求的什麼類型的資源
  // 知道了什麼類型的資源後,就可以根據這種類型的資源返回內容
  fs.readFile(fullPath, (err, data) => {
    if (err == null) {
      response.end(data);
    } else {
      console.log("404");
    }
  });
});

// 開啓服務器
server.listen(4399, () => {
  console.log("服務器開啓了...");
});

nodejs接收get傳遞過來的參數

前端傳參

  • get傳參:拼接在url上面

    http://127.0.0.1:4399/joke?id=8&username=admin

  • post傳參:不是拼接在url上面

    請求體中傳遞

const fs = require("fs");
const path = require("path");
const http = require("http");
const url = require("url");

const server = http.createServer((req, res) => {
  // console.log(req.url); // /?id=8&username=admin

  // 我們可以通過req.url拿到前端傳遞過來的參數
  // 但是要做字符串處理
  // 我們可以使用node.js的一個模塊:url模塊
  // 調用它的parse方法
  // 第一個參數:就是要處理的url
  // 第二個參數:如果給true的話就返回一個對象
  let urlObj = url.parse(req.url, true);
  //   console.log(urlObj);

  // 這個返回的對象裏面有一個query屬性,它也是一個對象,這個屬性裏面就youget傳遞過來的參數
  console.log(urlObj.query);

  // 那就可以在這裏根據這個接收到的id,去數據庫中獲取這個id的英雄的所有詳細信息
  // 返回給調用者

  // 如果在這裏拿到了id對應的英雄的詳細信息了,就可以返回,
  res.end(JSON.stringify(urlObj.query)); // 只能返回字符
});

server.listen(4399, () => {
  console.log("服務器開啓了...");
});

nodejs接收post傳遞過來的參數

在這裏插入圖片描述

const http = require("http");
const querystring = require("querystring");

const server = http.createServer((req, res) => {
  // req是請求對象
  // 因爲這裏是post的方式傳遞過來的參數,不是在url中的,所以用req.url是拿不到的
  //   console.log(req.url)

  // 那如何拿呢?
  // 一小塊一小塊的拿
  // 1. 你得有一個容器
  let postData = "";
  // 2. 給req對象一個data事件
  // 事件處理程序,參數是當前這次傳遞過來的這一小塊內容
  req.on("data", (chunk) => {
    postData += chunk;
  });
  // 3. 給req對象一個end事件
  // 表示數據傳遞完畢了
  req.on("end", () => {
    // 打印看看
    // console.log(postData); // username=admin&password=123456
    // 4. 解析這個傳遞過來的參數數據
    let postObj = querystring.parse(postData);
    console.log(postObj); // { username: 'admin', password: '123456' }

    // 5.
    //那在這裏就可以根據這個傳遞過來的賬號和密碼,去數據庫中判斷是否是正確的
    //如果正確的那在這裏就可以告訴用戶,賬號密碼正確

    res.end("sb");
  });
});

server.listen(4399, () => {
  console.log("服務器開啓了...");
});

第三方模塊的使用

    1. 新建一個文件夾,文件夾名字非中文,名字也不要和模塊名字一樣
    2. npm init -y 初始化
    3. 下載模塊,去npm官網搜索模塊,用他的說明來下
    4. 使用模塊,去模塊的官網,或者模塊說明中使用
var Crawler = require("crawler");
var fs = require("fs");

var c = new Crawler({
  encoding: null,
  jQuery: false, // set false to suppress warning message.
  callback: function (err, res, done) {
    if (err) {
      console.error(err.stack);
    } else {
      fs.createWriteStream(res.options.filename).write(res.body);
    }

    done();
  },
});

// 爬取數據
//爬一個b站中的視頻
//不是什麼樣的數據都可以爬下來,有些網站做了反爬
//反爬的機制:
//      看你這個請求是不是服務器,如果是就不給你數據
//      我們這裏是node.js是服務端,有時候有的數據就不給你.
//解決的辦法 ,僞裝:
//      把我們這個node.js後端服務器請求僞裝成客戶端(瀏覽器);
c.queue({
  uri:
    // "http://msn-img-nos.yiyouliao.com/inforec-20200703-f906b655a759e35e6ee1e7470184f66f.jpg?time=1593758869&signature=663062FDBD08E6A3E802F2055B3D5F2E",
    "https://cn-sxty2-cu-v-04.bilivideo.com/upgcxcode/46/29/203472946/203472946-1-16.mp4?expires=1593766200&platform=html5&ssig=faGf3-U7N-hzj6U60zc8Xw&oi=1006738461&trid=33046ef58ce948ddb69f3f9978c397e0h&nfc=1&nfb=maPYqpoel5MI3qOUX6YpRA==&mid=241600263&logo=80000000",
  filename: "06-npmUse/temp/meinv.avi",
  header: { "User-Agent": "requests" }, // 讓服務端僞裝成客戶端
});

paclkage.json與package-lock.json的區別

  1. 使用npm5之前的版本,是不會生成package-lockjson這個文件的。

  2. npm5以後,包括npm5這個版本, 纔會生成package-lock.json文件

  3. 當使用npm安裝包的時候,npm都會生成或者更新package-lock.json文件

  • npm5以後的版本,在安裝包的時候,不需要加–save (-S) 參數, 也會自動在package.json中保存依賴項
  • 當安裝包的時候,會自動創建或者更新package-lock json文件
  • package-lock json文件內保存了node_ _modules中所有包的信息,包含這些包的名稱、版本號、下載地址。帶來好處是,如果重新npm install的時候,就無需逐個分析包的依賴項,因此會大大加快安裝速度。
  • 從package-lock.json文件名來看,lock代表的是“鎖定”的意思。它用來鎖定當前開發使用的版本號,防止npm instal的時候自動更新到了更新版本。因爲新版本有可能會更新老的api,導致之前的代碼出錯。
    e-lock json文件內保存了node_ _modules中所有包的信息,包含這些包的名稱、版本號、下載地址。帶來好處是,如果重新npm install的時候,就無需逐個分析包的依賴項,因此會大大加快安裝速度。
  • 從package-lock.json文件名來看,lock代表的是“鎖定”的意思。它用來鎖定當前開發使用的版本號,防止npm instal的時候自動更新到了更新版本。因爲新版本有可能會更新老的api,導致之前的代碼出錯。
  • 原來的package json文件只能鎖定大版本,也就是版本號的第一位,並不能鎖定後面的小版本,你每次npm install都是拉取的該大版本下的最新的版本,爲了穩定性考慮我們幾乎是不敢隨意升級依賴包的,這將導致多出來很多工作量,測試適配等,所以package-lockjson文件出來了, 當你每次安裝-一個依賴的時候就鎖定在你安裝的這個版本。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章