js console 輸出到文件_Node.js核心入門

70deee98755be4ce04ac7a58f9df75c4.png

正文

核心模塊是Node.js的心臟,主要是有一些精簡高效的庫組成(這方面和Python有很大的相似之處),為Node.js提供了基礎的API。主要內容包括:

Node.js核心入門(一)

  • 全局對象

  • 常用工具

  • 事件機制

Node.js核心入門(二)

  • 文件系統訪問

  • HTTP服務器與客戶端

全局對象

全局對象我想學過JavaScript的都知道在瀏覽器是window,在程序的任何地方都可以訪問到全局對象,而在Node.js中,這個全局對象換成了global,所有的全局變量(除了global本身)都是global對象的屬性。而我們在Node.js中能夠直接訪問的對象通常都是global的屬性,如:console,process等。

全局對象與全局變量

global最根本的作用就是作為全局變量的宿主。按照ECMAScript規范,滿足以下條件的變量即為全局變量:

  • 在最外層定義的變量(在Node.js中不存在,因為Node.js的代碼在模塊中執行,不存在在最外層定義變量)

  • 全局對象的屬性

  • 隱式定義的變量(即未定義而直接進行賦值的變量)

當我們定義一個全局變量的時候,這個全局變量會自動成為全局變量的屬性。

process

process 對象是一個全局變量,它提供當前 Node.js 進程的相關信息,以及控制當前 Node.js 進程。通常我們在寫本地命令行程序的時候,少不了和它打交道。下面是它的最常用的成員方法:

1.process.argv

process.argv 屬性返回一個數組,這個數組包含了啟動Node.js進程時的命令行參數。第一個元素為process.execPath,第二個元素為當前執行的JavaScript文件路徑,剩余的元素為其他命令行參數。

例如存儲一個名為argv.js的文件:

// print process.argv
process.argv.forEach((val, index) => {
console.log(`${index}: ${val}`);
});

復制代碼

則命令行運行時這樣的:

$ node process-args.js one two=three four

0: /usr/local/bin/node
1: /Users/mjr/work/node/process-args.js
2: one
3: two=three
4: four
復制代碼

2.process.stdout

process.stdout是標準輸出流,通常我們使用的console.log()輸出打印字符,而process.stdout.write()函數提供了更為底層的接口。

process.stdout.write('請輸入num1的值:');
復制代碼

3.process.stdin

process.stdin是標準輸入流,初始時它是暫停的,要想從標準輸入讀取數據,我們必須恢復流,并手動編寫流的事件響應函數。

/*1:聲明變量*/
var num1, num2;
/*2:向屏幕輸出,提示信息,要求輸入num1*/
process.stdout.write('請輸入num1的值:');
/*3:監聽用戶的輸入*/
process.stdin.on('data', function (chunk) {
if (!num1) {
num1 = Number(chunk);
/*4:向屏幕輸出,提示信息,要求輸入num2*/
process.stdout.write('請輸入num2的值');
} else {
num2 = Number(chunk);
process.stdout.write('結果是:' + (num1 + num2));
}
});

復制代碼

4.process.nextTick(callback[, ...args])

...args 調用 callback時傳遞給它的額外參數 process.nextTick()方法將 callback 添加到"next tick 隊列"。一旦當前事件輪詢隊列的任務全部完成,在next tick隊列中的所有callbacks會被依次調用。這種方式不是setTimeout(fn, 0)的別名。它更加有效率,因此別用setTimeout去代替process.nextTick。事件輪詢隨后的ticks 調用,會在任何I/O事件(包括定時器)之前運行。

console.log('start');
process.nextTick(() => {
console.log('nextTick callback');
});
console.log('scheduled');

// start
// scheduled
// nextTick callback
復制代碼

console

console 模塊提供了一個簡單的調試控制臺,類似于 Web 瀏覽器提供的 JavaScript 控制臺。該模塊導出了兩個特定的組件:

  • 一個 Console 類,包含 console.log() 、 console.error() 和 console.warn() 等方法,可以被用于寫入到任何 Node.js 流。

  • 一個全局的 console 實例,可被用于寫入到 process.stdout 和 process.stderr。全局的 console 使用時無需調用 require('console')。(注意:全局的 console 對象的方法既不總是同步的(如瀏覽器中類似的 API),也不總是異步的(如其他 Node.js 流)。

比如全局下的常見的console實例:

console.log('hello,world');
// hello,world
console.log('hello%s', 'world');
// helloworld
console.error(new Error('錯誤信息'));
// Error: 錯誤信息
const name = '描述';
console.warn(`警告${name}`);
// 警告描述
console.trace() // 向標準錯誤流輸出當前的調用棧
復制代碼

常見的Console類:

const out = getStreamSomehow();
const err = getStreamSomehow();
const myConsole = new console.Console(out, err);

myConsole.log('hello,world');
// hello,world
myConsole.log('hello%s', 'world');
// helloworld
myConsole.error(new Error('錯誤信息'));
// Error: 錯誤信息
const name = '描述';
myConsole.warn(`警告${name}`);
//警告描述

復制代碼

常用工具 util

util 模塊主要用于支持 Node.js 內部 API 的需求。大部分實用工具也可用于應用程序與模塊開發者,用于彌補核心JavaScript的功能的不足。它的可以這樣調用:

const util = require('util');

復制代碼

1.util.inspect(object[, options])

util.inspect() 方法返回 object 的字符串表示,主要用于調試和錯誤輸出。附加的 options 可用于改變格式化字符串的某些方面。它至少接受一個參數objet,即要轉換的參數,而option則是可選的,可選內容如下:

  • showHidden 如果為 true,則 object 的不可枚舉的符號與屬性也會被包括在格式化后的結果中。默認為 false。

  • depth 指定格式化 object 時遞歸的次數。這對查看大型復雜對象很有用。默認為 2。若要無限地遞歸則傳入 null。

  • colors 如果為 true,則輸出樣式使用 ANSI 顏色代碼。默認為 false,可自定義。

  • customInspect 如果為 false,則 object 上自定義的 inspect(depth, opts) 函數不會被調用。默認為 true。

  • showProxy 如果為 true,則 Proxy 對象的對象和函數會展示它們的 target 和 handler 對象。默認為 false。

  • maxArrayLength 指定格式化時數組和 TypedArray 元素能包含的最大數量。默認為 100。設為 null 則顯式全部數組元素。設為 0 或負數則不顯式數組元素。

  • breakLength 一個對象的鍵被拆分成多行的長度。設為 Infinity 則格式化一個對象為單行。默認為 60。

例如,查看 util 對象的所有屬性:

const util = require('util');
console.log(util.inspect(util, { showHidden: true, depth: null }));

復制代碼

2.util.callbackify(original)

util.callbackify(original)方法將 async 異步函數(或者一個返回值為 Promise 的函數)轉換成遵循 Node.js 回調風格的函數。在回調函數中, 第一個參數 err 為 Promise rejected 的原因 (如果 Promise 狀態為 resolved , err為 null ),第二個參數則是 Promise 狀態為 resolved 時的返回值。例如:

const util = require('util');

async function fn() {
return await Promise.resolve('hello world');
}
const callbackFunction = util.callbackify(fn);

callbackFunction((err, ret) => {
if (err) throw err;
console.log(ret);
});
// hello world
復制代碼

注意:

  • 回調函數是異步執行的, 并且有異常堆棧錯誤追蹤. 如果回調函數拋出一個異常, 進程會觸發一個 'uncaughtException' 異常, 如果沒有被捕獲, 進程將會退出。

  • null 在回調函數中作為一個參數有其特殊的意義, 如果回調函數的首個參數為 Promise rejected 的原因且帶有返回值, 且值可以轉換成布爾值 false, 這個值會被封裝在 Error 對象里, 可以通過屬性 reason 獲取。

function fn() {
return Promise.reject(null);
}
const callbackFunction = util.callbackify(fn);

callbackFunction((err, ret) => {
// 當Promise的rejecte是null時,它的Error與原始值都會被存儲在'reason'中。
err && err.hasOwnProperty('reason') && err.reason === null; // true
});
復制代碼

事件驅動 events

events是Node.js最重要的模塊,原因是Node.js本身架構就是事件式的,大多數 Node.js 核心 API 都采用慣用的異步事件驅動架構,而它提供了唯一的接口,因此堪稱Node.js事件編程的及時。events 模塊不僅用于用戶代碼與 Node.js 下層事件循環的交互,還幾乎被所有的模塊依賴。

所有能觸發事件的對象都是 EventEmitter 類的實例。這些對象開放了一個 eventEmitter.on() 函數,允許將一個或多個函數綁定到會被對象觸發的命名事件上。事件名稱通常是駝峰式的字符串,但也可以使用任何有效的 JavaScript 屬性名。對于每個事件, EventEmitter支持 若干個事件監聽器。當事件發射時,注冊到這個事件的事件監聽器被依次調用,事件參數作 為回調函數參數傳遞。

例如:

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
// eventEmitter.on() 方法用于注冊監聽器
myEmitter.on('event', () => {
console.log('觸發了一個事件!');
});
// eventEmitter.emit() 方法用于觸發事件
myEmitter.emit('event');

復制代碼

下面讓我們來看看EventEmitter最常用的API:

  • EventEmitter.on(event, listener) 方法可以添加 listener 函數到名為 eventName 的事件的監聽器數組的末尾。不會檢查 listener 是否已被添加。多次調用并傳入相同的 eventName 和 listener 會導致 listener 被添加與調用多次。

  • emitter.prependListener(eventName, listener)方法可以添加 listener 函數到名為 eventName 的事件的監聽器數組的開頭。不會檢查 listener 是否已被添加。多次調用并傳入相同的 eventName 和 listener 會導致 listener 被添加與調用多次。

  • eventEmitter.emit() 方法允許將任意參數傳給監聽器函數。當一個普通的監聽器函數被 EventEmitter 調用時,標準的 this 關鍵詞會被設置指向監聽器所附加的 EventEmitter。

// 實例:
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// 打印:
// b
// a
復制代碼
  • EventEmitter.once(event, listener) 為指定事件注冊一個單次監聽器,即監聽器最多只會觸發一次,觸發后立刻解除該監聽器。

server.once('connection', (stream) => {
console.log('首次調用!');
});
復制代碼
  • EventEmitter.removeListener(event, listener) 移除指定事件的某個監聽器, listener 必須是該事件已經注冊過的監聽器。(注意:removeListener 最多只會從監聽器數組里移除一個監聽器實例。如果任何單一的監聽器被多次添加到指定 eventName 的監聽器數組中,則必須多次調用 removeListener 才能移除每個實例。)

const callback = (stream) => {
console.log('有連接!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);

復制代碼
  • EventEmitter.removeAllListeners([event]) 移除所有事件的所有監聽器,如果指定 event ,則移除指定事件的所有監聽器

const callback = (stream) => {
console.log('有連接!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
復制代碼

error 事件

EventEmitter 定義了一個特殊的事件 error ,它包含了“錯誤”的語義,我們在遇到異常的時候通常會發射 error 事件。當 error被發射時,EventEmitter規定如果沒有響 應的監聽器,Node.js 會把它當作異常,退出程序并打印調用棧。我們一般要為會發射 error 事件的對象設置監聽器,避免遇到錯誤后整個程序崩潰。

var events = require('events');
var emitter = new events.EventEmitter();
emitter.emit('error');
復制代碼

繼承EventEmitter

大多數情況下,我們不會直接使用EventEmitter,而是在對象中繼承它,包括fs,http在內的只要是支持事件響應的核心模塊都是EventEmitter的子類。這樣做的原因有以下兩個:

  • 具有某個實體功能的對象實現事件符合語義,事件的監聽和發射應該是一個對象的方法。

  • JavaScript 的對象機制是基于原型的,支持部分多重繼承,繼承 EventEmitter 不會打亂對象原有的繼承關系。

來源:https://juejin.cn/post/6844903586283913230

2beeb452ceb68471096ea1b734cb19b7.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/541613.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/541613.shtml
英文地址,請注明出處:http://en.pswp.cn/news/541613.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

scala 當前日期_如何在Scala中檢查當前日期和時間?

scala 當前日期Scala is a general-purpose programming language, which is majorly used for data manipulation. It has libraries and support for almost all different utilities that are important. One of the important things that are required while programming …

計算機科學考試大綱,計算機科學與技術考試大綱.doc

計算機科學與技術考試大綱計算機科學與技術專業本專業的專業課程考試為“計算機軟件基礎”和“計算機硬件基礎”兩門課程的組合試卷,卷面總分200分,時間150分鐘,考試方式為筆試。考試可攜帶計數器,但禁止攜帶文曲星、商務通等帶有…

eclipse中項目內存溢出問題

2019獨角獸企業重金招聘Python工程師標準>>> SpringBoot項目熱啟動Perm區內存溢出。 Failed to instantiate [org.springframework.orm.jpa.JpaVendorAdapter]: Factory method jpaVendorAdapter threw exception; nested exception is java.lang.OutOfMemoryErro…

云盾idaas登陸_移動端掃碼登錄IDaaS平臺

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":10,"count":10}]},"card":[{"des":"刷臉門禁通行系統前端接入人臉AI賦能的人臉…

express rest_Express / Node中用于REST API的郵遞員工具

express restWhen dealing with routes (like in express), we may use any of the REST verbs and at times, the browser is limited to facilitate testing the routes/REST API. 在處理路由時(如快速表達),我們可以使用任何REST動詞,有時瀏覽器會受到…

我們在使用計算機時,不能做什么?,11秋季學期計算機應用技術基礎學習周期_01任務-在線作業[1]1...

1.選購顯示器應優先考慮顯示器的( B )性能指標選A.顯示器的防輻射指標B. 顯示器的帶寬C. 顯示器的刷新率D. 顯示器的尺寸2. 一個聲音文件采用雙聲道8位采樣精度、22K采樣頻率錄音,它的大小是5M,如果采用單聲道16位采樣精度、44K采樣頻率錄音,…

按一個按鈕會隨機死人_《饑荒》那些年坑爹的隨機地圖,最后一個簡直笑死人...

饑荒是一款隨機性很強的游戲,這也是饑荒這款游戲相當耐玩的主要原因。別的不說小編敢保證隨機開圖的話你絕對找不到兩張一模一樣的地圖。地圖上的資源也會大不相同。不管是稀有的各種奇遇還是基礎資源的刷新數量都是完全不同的。當然對于一些基礎資源玩家們并沒有多…

介詞at_介詞邏輯| 離散數學

介詞at介詞或陳述 (Preposition or Statement) A preposition is a definition sentence which is true or false but not both. 介詞是一個定義語句,它是對還是錯,但不能同時包含兩者。 For example: The following 8 sentences, 例如:以下…

職稱計算機提前考試試卷,職稱計算機考試多項選擇考試卷模擬考^試題

《職稱計算機考試多項選擇考試卷模擬考^試題》由會員分享,可在線閱讀,更多相關《職稱計算機考試多項選擇考試卷模擬考^試題(8頁珍藏版)》請在人人文庫網上搜索。1、姓名:________________ 班級:________________ 學號:…

形象易懂講解算法I——小波變換

https://zhuanlan.zhihu.com/p/22450818?referdong5 最早發于回答:能不能通俗的講解下傅立葉分析和小波分析之間的關系? - 咚懂咚懂咚的回答現收入專欄。從傅里葉變換到小波變換,并不是一個完全抽象的東西,可以講得很形象。小波變…

r語言安裝ipsolve_R語言矩陣操作之矩陣運算

1.轉置運算對于矩陣A,函數t(A)表示矩陣A的轉置,如:> Amatrix(1:6,nrow2);> A;[,1] [,2] [,3][1,] 1 3 5[2,] 2 4 6> t(A);[,1] [,2][1,] 1 2[2,] 3 4[3,] 5 62.求方陣的行列式函數det()是求矩陣…

使用Linux命令行歸檔文件

存檔文件 (Archiving Files) As we already understand what Compression (Compression techniques in Linux) is? We shall learn about Archives. We prefer compression as it is convenient to send file compressed through a network but sometimes it is not a smart w…

http緩存機制之304狀態碼

在網上看到一篇關于解釋瀏覽器緩存更新機制304狀態碼的文章,里面說如果請求頭中的If-Modified-Since字段和If-None-Match字段的值分別和響應頭中的Last-Modified字段和Etag字段值一致,服務器就會返回304狀態碼(無響應體),瀏覽器就從本地讀取緩…

東北大學 計算機技術導師,報考東北大學 計算機技術 329分 求調劑相關專業

自薦類型:碩士自薦報考院校:東北大學報考專業:(專業碩士)計算機技術[085211]本科院校:沈陽工程學院本科專業:計算機科學與技術初試成績:總分:329政治:69 英語:71 …

c語言i++和++i程序_使用C ++程序修改鏈接列表的內容

c語言i和i程序Problem statement: 問題陳述: Given a linked list, you modified that linked list in such a way that the elements of the first half of that linked list are the difference of the first node to the last node and next node is the differ…

原生js設置div隱藏或者顯示_10種JS控制DIV的顯示隱藏代碼

div隱藏與顯示#menus {background-color: #c4cff0;}function Layer_HideOrShow(cur_div){ var currentdocument.getElementById(cur_div);if(current.style.visibility"hidden"){current.style.visibility "visible";}else{current.style.visibility "…

計算機工作對身體有害嗎,在電腦前長時間工作會對身體有害處嗎?

病情分析:目前,電腦對人體生理和心理方面的負面影響已日益受到人們的重視.為此科學使用電腦,減少電腦和網絡的危害是十分必要的.指導意見:一是要增強自我保健意識工作間隙注意適當休息,一般來說,電腦操作人員在連續工作1小時后應該休息10分鐘左右.并且最…

Java LinkedList getFirst()方法與示例

LinkedList getFirst()方法 (LinkedList getFirst() method) This method is available in package java.util.LinkedList. 軟件包java.util.LinkedList中提供了此方法。 This method is used to return the first or initial or beginning element of the linked list. 此方法…

C++第15周(春)項目2 - 用文件保存的學生名單

課程首頁在:http://blog.csdn.net/sxhelijian/article/details/11890759。內有完整教學方案及資源鏈接本程序中須要的相關文件。請到http://pan.baidu.com/s/1qW59HTi下載。【項目2-用文件保存的學生名單】  文件score.dat中保存的是若干名學生的姓名和C課、高數和…

計算機選配 注意事項,選擇鼠標注意事項有哪些

選擇鼠標注意事項有哪些每臺電腦旁邊都有了一個忠實的伴侶,那就是“Mouse”--鼠標。選擇鼠標最重要的一點就是質量,無論它的功能有多強大、外形多漂亮,如果質量不好那么一切都不用考慮了。那么,選擇鼠標注意事項有哪些?筆記本鼠標…