Node.js 1 --- 基礎學習

內容

  • Node.js介紹javascript

    • 是什麼
    • 特性
    • 模塊化
  • 能作什麼
  • Node.js的一些學習資源
  • 讀取文件 - fs
  • 構建web服務器 - http

1、Node.js介紹

一、Node.js是什麼

image.png

  • Node.js是一個能夠解析和執行JavaScript代碼的JavaScript運行時環境html

    • Node.js不是一門語言
    • 不是庫,不是框架,是一個平臺
    • Node.js是一個JavaScript運行時環境
    • 簡單來講就是Node.js能夠解析和執行JavaScript代碼
    • 也就是說如今的JavaScript能夠徹底脫離瀏覽器運行,一切歸功於Node.js
  • 構建於chrome V8之上java

    • 代碼只是特性的字符串
    • 引擎能夠認識它,並解析和執行
    • Google Chrome v8引擎是目前公認的解析和執行JavaScript最快的的引擎
    • Node.js的做者把Google Chrome 的v8引擎移植出來,開發了一個獨立的JavaScript運行時環境
  • 瀏覽器中的JavaScriptnode

    • ECMAScript
    • DOM
    • BOM
  • Node.js中的JavaScriptgit

    • ECMAScript
    • 沒有DOM,BOM---服務端不操做DOM和BOM
    • Node.js爲JavaScript提供了一些服務器級別操做的APIweb

      • 文件的讀寫
      • 網絡服務的構建
      • 網絡通訊
      • http服務器等處理
    • 這些API核心模塊是由 Node 提供的一個個的具名的模塊,它們都有本身特殊的名稱標識
    • 咱們經過require引入
    var fs=require('fs')
  • Node.js的特性chrome

    • 事件驅動
    • 非阻塞IO模型(異步)
    • 輕量和高效
  • Node.js包生態系統-npm--世界上最大的開源庫npm

    • 絕大多數的JavaScript相關的包都保存在了npm上,這樣讓開發人員更方便的下載使用
  • Node模塊化編程

    • 模塊有三種api

      • 具名模塊:fs,http
      • 用戶本身編寫的模塊

        • 使用 exports 導出,使用 require 導入
        • Node沒有全局做用域,只有模塊做用域,外部訪問不到內部,內部也訪問不到外部
        • 相對路徑用"./"
        • 能夠省略後綴名

二、Node.js能作什麼

  • WEB服務器後臺
  • 命令行工具

    • git(C語言)
    • npm(node開發的)
    • hexo(node)

三、一些資源

四、能學到什麼

  • B/S編程模型

    • Brower-Server
    • back-end
    • 服務器端語言都是B/S模型
  • 模塊化編程

    • RequireJS
    • SeaJS
    • 之前認識的JavaScript只能經過<script>標籤來加載
    • 在node中能夠像@import同樣引入加載JavaScript腳本文件
  • Node經常使用API
  • 異步編程

    • 回調函數
    • Promise
    • async
    • generator
  • Express第三方開發框架
  • ES6

2、Hello World

  1. 建立編寫JavaScript腳本文件
  2. 終端定位到對應目錄
  3. node 文件名 執行對應的文件

注意:

  • 文件不能使用node.js命名
  • 儘可能不使用中文命名
  • Node中採用ECMAScript進行編碼,沒有DOM和BOM

3、文件的讀寫

fs: file system 文件系統。node的fs模塊中包含全部文件操做相關的API

  1. 使用require方法加載 fs 核心模塊
var fs=require('fs')
  1. 讀文件

    • 第一個參數就是要讀取的文件路徑
    • 第二個參數是一個回調函數
    • 成功

      • data 數據
      • error null
    • 失敗

      • data undefined沒有數據
      • error 錯誤對象
fs.readFlie("要讀取文件的路徑",(err,data)=>{
     if (error) {
        console.log('讀取文件失敗了')
     } else {
        console.log(data.toString())
     }
})
  1. 寫文件

    • 第一個參數:文件路徑
    • 第二個參數:文件內容
    • 第三個參數:回調函數

      • 回調函數有參數:error
    • 成功:

      • 文件寫入成功
      • error 是 null
    • 失敗:

      • 文件寫入失敗
      • error 就是錯誤對象
fs.writeFile('./data/你好.md', '你們好,給你們介紹一下,我是Node.js', function (error) {
    if (error) {
         console.log('寫入失敗')
     } else {
        console.log('寫入成功了')
    }
})

四 構建web服務器

4.1關於ip地址和端口號

  • ip地址用來定位計算機
  • 端口號用來定位具體的應用程序
  • 一切須要聯網通訊的軟件都會佔用一個端口號
  • 端口號範圍 0-65536
  • 最好不要去使用計算機的一些默認端口,例如http服務的80端口

4.2 http模塊:建立編寫服務器

1.加載http核心模塊

var http = require('http');

2.使用http.createServer建立一個服務器實例

var server = http.createServer()

3.綁定端口號,啓動服務器

server.listen(3000, function() {
       console.log('服務器啓動成功了,能夠經過 http://127.0.0.1:3000/ 來進行訪問')
   })
- 執行此文件,就會打印'服務器啓動成功了,能夠經過 http://127.0.0.1:3000/ 來進行訪問'
- 瀏覽器訪問http://127.0.0.1:3000/會打印'收到客戶端的請求了''

4.服務器要幹嗎?接受請求,發送響應數據

  • 客戶端訪問服務器地址,發送訪問請求
  • 服務器端 註冊 request 請求事件,接收請求,
  • 執行第二個參數:回調處理函數(請求事件處理函數),並處理請求,發送響應

    • request 請求事件處理函數,須要接收兩個參數:
    • Request 請求對象 : 能夠用來獲取客戶端的一些請求信息,例如請求路徑

      • 例如:request.url : 請求路徑
    • Response 響應對象 : 能夠用來給客戶端發送響應消息

      • response對象有一個方法:response.write(),能夠用來給客戶端發送響應數據
      • write 可使用屢次,可是最後必定要使用 end方法來結束響應,不然客戶端會一直等待
      • 通常狀況下,咱們直接使用response.end("響應數據")
  • 用例
server.on('request', function (request, response) {

  console.log('收到客戶端的請求了,請求路徑是:' + request.url)

  // response 對象有一個方法:write 能夠用來給客戶端發送響應數據
  // write 可使用屢次,可是最後必定要使用 end 來結束響應,不然客戶端會一直等待
  response.write('hello')
  response.write(' nodejs')
  // 告訴客戶端,個人話說完了,你能夠呈遞給用戶了
  response.end()
})

根據不一樣的url響應不一樣的內容

var http = require('http')

// 1. 建立 Server
var server = http.createServer()

// 2. 監聽 request 請求事件,設置請求處理函數
server.on('request', function (req, res) {

  var url = req.url

  if (url === '/') {
    res.end('index page')
  } else if (url === '/login') {
    res.end('login page')
  } else if (url === '/products') {
    var products = [{
        name: '蘋果 X',
        price: 8888
      },
      {
        name: '菠蘿 X',
        price: 5000
      },
      {
        name: '小辣椒 X',
        price: 1999
      }
    ]

    // 響應內容只能是二進制數據或者字符串
    //  數字
    //  對象
    //  數組
    //  布爾值
    res.end(JSON.stringify(products))
  } else {
    res.end('404 Not Found.')
  }
})

// 3. 綁定端口號,啓動服務
server.listen(3000, function () {
  console.log('服務器啓動成功,能夠訪問了。。。')
})

4.3. content-type---瀏覽器響應內容類型及編碼

  • 不一樣的類型對應不一樣的content-type
  • 查找工具: http://tool.oschina.net/commons
  • 圖片不須要指定編碼格式,通常爲字符串指定編碼格式

    res.setHeader('Content-Type', 'text/plain; charset=utf-8')
        res.setHeader('Content-Type', 'text/html; charset=utf-8')
        res.setHeader('Content-Type', 'image/jpeg')
    - 服務器默認發送數據的格式是utf-8模式
    - 瀏覽器默認操做系統的編碼:中文編碼:gbk
    - 在 http 協議中,Content-T就是用來告知對方我給你發送的數據內容是什麼類型
    - text/plain 普通文本,若是是html格式的,用text/html

4.4. fs 模塊和http模塊組合使用讀取不一樣的內容

var http = require('http')
var fs = require('fs')

var server = http.createServer()

server.on('request', function (req, res) {
  // / index.html
  var url = req.url

  if (url === '/') {
   
    // 咱們要發送的仍是在文件中的內容
    fs.readFile('./resource/index.html', function (err, data) {
      if (err) {
        res.setHeader('Content-Type', 'text/plain; charset=utf-8')
        res.end('文件讀取失敗,請稍後重試!')
      } else {
        // data 默認是二進制數據,能夠經過 .toString 轉爲我們能識別的字符串
        // res.end() 支持兩種數據類型,一種是二進制,一種是字符串
        res.setHeader('Content-Type', 'text/html; charset=utf-8')
        res.end(data)
      }
    })
  } else if (url === '/xiaoming') {
    // url:統一資源定位符
    // 一個 url 最終實際上是要對應到一個資源的
    fs.readFile('./resource/ab2.jpg', function (err, data) {
      if (err) {
        res.setHeader('Content-Type', 'text/plain; charset=utf-8')
        res.end('文件讀取失敗,請稍後重試!')
      } else {
        // data 默認是二進制數據,能夠經過 .toString 轉爲我們能識別的字符串
        // res.end() 支持兩種數據類型,一種是二進制,一種是字符串
        // 圖片就不須要指定編碼了,由於咱們常說的編碼通常指的是:字符編碼
        res.setHeader('Content-Type', 'image/jpeg')
        res.end(data)
      }
    })
  }
})

server.listen(3000, function () {
  console.log('Server is running...')
})
相關文章
相關標籤/搜索