日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

【转载】Node.js 教程(菜鸟教程系列)

發(fā)布時間:2023/12/13 综合教程 26 生活家
生活随笔 收集整理的這篇文章主要介紹了 【转载】Node.js 教程(菜鸟教程系列) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

很好的一篇教程:Node.js 教程

簡單做下筆記

概述

簡單的說 Node.js 就是運行在服務端的 JavaScript。

Node.js 是一個基于Chrome JavaScript 運行時建立的一個平臺。

Node.js是一個事件驅(qū)動I/O服務端JavaScript環(huán)境,基于Google的V8引擎,V8引擎執(zhí)行Javascript的速度非常快,性能非常好。

安裝

win下安裝后自動配置環(huán)境變量,重啟后可用

NPM

NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問題,常見的使用場景有以下幾種:

允許用戶從NPM服務器下載別人編寫的第三方包到本地使用。
允許用戶從NPM服務器下載并安裝別人編寫的命令行程序到本地使用。
允許用戶將自己編寫的包或命令行程序上傳到NPM服務器供別人使用。

npm 安裝 Node.js 模塊語法格式如下:

npm install <Module Name>

我們使用 npm 命令安裝常用的 Node.js web框架模塊express:

npm install express

安裝好之后,express 包就放在了工程目錄下的 node_modules 目錄中,因此在代碼中只需要通過require('express')的方式就好,無需指定第三方包路徑。

var express = require('express');

創(chuàng)建服務器

var http = require('http');

http.createServer(function (request, response) {

    // 發(fā)送 HTTP 頭部 
    // HTTP 狀態(tài)值: 200 : OK
    // 內(nèi)容類型: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});

    // 發(fā)送響應數(shù)據(jù) "Hello World"
    response.end('Hello World
');
}).listen(8888);

// 終端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');

第一行請求(require)Node.js 自帶的 http 模塊,并且把它賦值給 http 變量。
接下來我們調(diào)用 http 模塊提供的函數(shù): createServer 。這個函數(shù)會返回 一個對象,這個對象有一個叫做 listen 的方法,這個方法有一個數(shù)值參數(shù), 指定這個 HTTP 服務器監(jiān)聽的端口號。

Node.js 回調(diào)函數(shù)

Node.js 異步編程的直接體現(xiàn)就是回調(diào)。

異步編程依托于回調(diào)來實現(xiàn),但不能說使用了回調(diào)后程序就異步化了。

回調(diào)函數(shù)在完成任務后就會被調(diào)用,Node 使用了大量的回調(diào)函數(shù),Node 所有 API 都支持回調(diào)函數(shù)。

執(zhí)行異步操作的函數(shù)將回調(diào)函數(shù)作為最后一個參數(shù), 回調(diào)函數(shù)接收錯誤對象作為第一個參數(shù)。

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {  //fs.readFile() 是異步函數(shù)用于讀取文件
   if (err){
      console.log(err.stack);
      return;
   }
   console.log(data.toString());
});
console.log("程序執(zhí)行完畢");

Node.js 事件循環(huán)

Node.js 是單進程單線程應用程序,但是通過事件和回調(diào)支持并發(fā),所以性能非常高。

Node.js 的每一個 API 都是異步的,并作為一個獨立線程運行,使用異步函數(shù)調(diào)用,并處理并發(fā)。

Node.js 基本上所有的事件機制都是用設計模式中觀察者模式實現(xiàn)。

Node.js 單線程類似進入一個while(true)的事件循環(huán),直到?jīng)]有事件觀察者退出,每個異步事件都生成一個事件觀察者,如果有事件發(fā)生就調(diào)用該回調(diào)函數(shù).

事件驅(qū)動程序

Node.js 使用事件驅(qū)動模型,當web server接收到請求,就把它關閉然后進行處理,然后去服務下一個web請求。

當這個請求完成,它被放回處理隊列,當?shù)竭_隊列開頭,這個結(jié)果被返回給用戶。

這個模型非常高效可擴展性非常強,因為webserver一直接受請求而不等待任何讀寫操作。(這也被稱之為非阻塞式IO或者事件驅(qū)動IO)

在事件驅(qū)動模型中,會生成一個主循環(huán)來監(jiān)聽事件,當檢測到事件時觸發(fā)回調(diào)函數(shù)。

整個事件驅(qū)動的流程就是這么實現(xiàn)的,非常簡潔。有點類似于觀察者模式,事件相當于一個主題(Subject),而所有注冊到這個事件上的處理函數(shù)相當于觀察者(Observer)。

Node.js 有多個內(nèi)置的事件,我們可以通過引入 events 模塊,并通過實例化 EventEmitter 類來綁定和監(jiān)聽事件,如下實例:

// 引入 events 模塊
var events = require('events');
// 創(chuàng)建 eventEmitter 對象
var eventEmitter = new events.EventEmitter();

// 創(chuàng)建事件處理程序
var connectHandler = function connected() {
   console.log('連接成功。');
  
   // 觸發(fā) data_received 事件 
   eventEmitter.emit('data_received');
}

// 綁定 connection 事件處理程序
eventEmitter.on('connection', connectHandler);
 
// 使用匿名函數(shù)綁定 data_received 事件
eventEmitter.on('data_received', function(){
   console.log('數(shù)據(jù)接收成功。');
});

// 觸發(fā) connection 事件 
eventEmitter.emit('connection');

console.log("程序執(zhí)行完畢。");

EventEmitter 類

events 模塊只提供了一個對象: events.EventEmitter。EventEmitter 的核心就是事件觸發(fā)與事件監(jiān)聽器功能的封裝。

你可以通過require("events");來訪問該模塊。

EventEmitter 的每個事件由一個事件名和若干個參數(shù)組成,事件名是一個字符串,通常表達一定的語義。對于每個事件,EventEmitter 支持 若干個事件監(jiān)聽器。

當事件觸發(fā)時,注冊到這個事件的事件監(jiān)聽器被依次調(diào)用,事件參數(shù)作為回調(diào)函數(shù)參數(shù)傳遞。

//event.js 文件
var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener1', arg1, arg2); 
}); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener2', arg1, arg2); 
}); 
emitter.emit('someEvent', 'arg1 參數(shù)', 'arg2 參數(shù)'); 

EventEmitter 提供了多個屬性,如onemiton函數(shù)用于綁定事件函數(shù),emit屬性用于觸發(fā)一個事件。

Node.js 函數(shù)

一個函數(shù)可以作為另一個函數(shù)接收一個參數(shù),把 say 函數(shù)作為execute函數(shù)的第一個變量進行了傳遞。這里返回的不是 say 的返回值,而是 say 本身!

function say(word) {
  console.log(word);
}

function execute(someFunction, value) {
  someFunction(value);
}

execute(say, "Hello");

匿名函數(shù)

function execute(someFunction, value) {
  someFunction(value);
}

execute(function(word){ console.log(word) }, "Hello");

簡約而不簡單的HTTP服務器

var http = require("http");

http.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}).listen(8888);

Node.js GET/POST請求

獲取 URL 的參數(shù)

node.js中url模塊中的parse函數(shù)提供了這個功能,在瀏覽器中訪問http://localhost:3000/user?name=菜鳥教程&url=www.runoob.com

var http = require('http');
var url = require('url');
var util = require('util');
 
http.createServer(function(req, res){
    res.writeHead(200, {'Content-Type': 'text/plain'});
 
    // 解析 url 參數(shù)
    var params = url.parse(req.url, true).query;
    res.write("網(wǎng)站名:" + params.name);
    res.write("
");
    res.write("網(wǎng)站 URL:" + params.url);
    res.end();
 
}).listen(3000);

獲取 POST 請求內(nèi)容

var http = require('http');
var querystring = require('querystring');
 
http.createServer(function(req, res){
    // 定義了一個post變量,用于暫存請求體的信息
    var post = '';     
 
    // 通過req的data事件監(jiān)聽函數(shù),每當接受到請求體的數(shù)據(jù),就累加到post變量中
    req.on('data', function(chunk){    
        post += chunk;
    });
 
    // 在end事件觸發(fā)后,通過querystring.parse將post解析為真正的POST請求格式,然后向客戶端返回。
    req.on('end', function(){    
        post = querystring.parse(post);
        res.end(util.inspect(post));
    });
}).listen(3000);

總結(jié)

以上是生活随笔為你收集整理的【转载】Node.js 教程(菜鸟教程系列)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。