js console 输出到文件_Node.js核心入门
正文
核心模塊是Node.js的心臟,主要是有一些精簡高效的庫組成(這方面和Python有很大的相似之處),為Node.js提供了基礎(chǔ)的API。主要內(nèi)容包括:
Node.js核心入門(一)
全局對(duì)象
常用工具
事件機(jī)制
Node.js核心入門(二)
文件系統(tǒng)訪問
HTTP服務(wù)器與客戶端
全局對(duì)象
全局對(duì)象我想學(xué)過JavaScript的都知道在瀏覽器是window,在程序的任何地方都可以訪問到全局對(duì)象,而在Node.js中,這個(gè)全局對(duì)象換成了global,所有的全局變量(除了global本身)都是global對(duì)象的屬性。而我們?cè)贜ode.js中能夠直接訪問的對(duì)象通常都是global的屬性,如:console,process等。
全局對(duì)象與全局變量
global最根本的作用就是作為全局變量的宿主。按照ECMAScript規(guī)范,滿足以下條件的變量即為全局變量:
在最外層定義的變量(在Node.js中不存在,因?yàn)镹ode.js的代碼在模塊中執(zhí)行,不存在在最外層定義變量)
全局對(duì)象的屬性
隱式定義的變量(即未定義而直接進(jìn)行賦值的變量)
當(dāng)我們定義一個(gè)全局變量的時(shí)候,這個(gè)全局變量會(huì)自動(dòng)成為全局變量的屬性。
process
process 對(duì)象是一個(gè)全局變量,它提供當(dāng)前 Node.js 進(jìn)程的相關(guān)信息,以及控制當(dāng)前 Node.js 進(jìn)程。通常我們?cè)趯懕镜孛钚谐绦虻臅r(shí)候,少不了和它打交道。下面是它的最常用的成員方法:
1.process.argv
process.argv 屬性返回一個(gè)數(shù)組,這個(gè)數(shù)組包含了啟動(dòng)Node.js進(jìn)程時(shí)的命令行參數(shù)。第一個(gè)元素為process.execPath,第二個(gè)元素為當(dāng)前執(zhí)行的JavaScript文件路徑,剩余的元素為其他命令行參數(shù)。
例如存儲(chǔ)一個(gè)名為argv.js的文件:
// print process.argvprocess.argv.forEach((val, index) => {
console.log(`${index}: ${val}`);
});
復(fù)制代碼
則命令行運(yùn)行時(shí)這樣的:
$ node process-args.js one two=three four0: /usr/local/bin/node
1: /Users/mjr/work/node/process-args.js
2: one
3: two=three
4: four
復(fù)制代碼
2.process.stdout
process.stdout是標(biāo)準(zhǔn)輸出流,通常我們使用的console.log()輸出打印字符,而process.stdout.write()函數(shù)提供了更為底層的接口。
process.stdout.write('請(qǐng)輸入num1的值:');復(fù)制代碼
3.process.stdin
process.stdin是標(biāo)準(zhǔn)輸入流,初始時(shí)它是暫停的,要想從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù),我們必須恢復(fù)流,并手動(dòng)編寫流的事件響應(yīng)函數(shù)。
/*1:聲明變量*/var num1, num2;
/*2:向屏幕輸出,提示信息,要求輸入num1*/
process.stdout.write('請(qǐng)輸入num1的值:');
/*3:監(jiān)聽用戶的輸入*/
process.stdin.on('data', function (chunk) {
if (!num1) {
num1 = Number(chunk);
/*4:向屏幕輸出,提示信息,要求輸入num2*/
process.stdout.write('請(qǐng)輸入num2的值');
} else {
num2 = Number(chunk);
process.stdout.write('結(jié)果是:' + (num1 + num2));
}
});
復(fù)制代碼
4.process.nextTick(callback[, ...args])
...args 調(diào)用 callback時(shí)傳遞給它的額外參數(shù) process.nextTick()方法將 callback 添加到"next tick 隊(duì)列"。一旦當(dāng)前事件輪詢隊(duì)列的任務(wù)全部完成,在next tick隊(duì)列中的所有callbacks會(huì)被依次調(diào)用。這種方式不是setTimeout(fn, 0)的別名。它更加有效率,因此別用setTimeout去代替process.nextTick。事件輪詢隨后的ticks 調(diào)用,會(huì)在任何I/O事件(包括定時(shí)器)之前運(yùn)行。
console.log('start');process.nextTick(() => {
console.log('nextTick callback');
});
console.log('scheduled');
// start
// scheduled
// nextTick callback
復(fù)制代碼
console
console 模塊提供了一個(gè)簡單的調(diào)試控制臺(tái),類似于 Web 瀏覽器提供的 JavaScript 控制臺(tái)。該模塊導(dǎo)出了兩個(gè)特定的組件:
一個(gè) Console 類,包含 console.log() 、 console.error() 和 console.warn() 等方法,可以被用于寫入到任何 Node.js 流。
一個(gè)全局的 console 實(shí)例,可被用于寫入到 process.stdout 和 process.stderr。全局的 console 使用時(shí)無需調(diào)用 require('console')。(注意:全局的 console 對(duì)象的方法既不總是同步的(如瀏覽器中類似的 API),也不總是異步的(如其他 Node.js 流)。
比如全局下的常見的console實(shí)例:
console.log('hello,world');// hello,world
console.log('hello%s', 'world');
// helloworld
console.error(new Error('錯(cuò)誤信息'));
// Error: 錯(cuò)誤信息
const name = '描述';
console.warn(`警告${name}`);
// 警告描述
console.trace() // 向標(biāo)準(zhǔn)錯(cuò)誤流輸出當(dāng)前的調(diào)用棧
復(fù)制代碼
常見的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('錯(cuò)誤信息'));
// Error: 錯(cuò)誤信息
const name = '描述';
myConsole.warn(`警告${name}`);
//警告描述
復(fù)制代碼
常用工具 util
util 模塊主要用于支持 Node.js 內(nèi)部 API 的需求。大部分實(shí)用工具也可用于應(yīng)用程序與模塊開發(fā)者,用于彌補(bǔ)核心JavaScript的功能的不足。它的可以這樣調(diào)用:
const util = require('util');復(fù)制代碼
1.util.inspect(object[, options])
util.inspect() 方法返回 object 的字符串表示,主要用于調(diào)試和錯(cuò)誤輸出。附加的 options 可用于改變格式化字符串的某些方面。它至少接受一個(gè)參數(shù)objet,即要轉(zhuǎn)換的參數(shù),而option則是可選的,可選內(nèi)容如下:
showHidden 如果為 true,則 object 的不可枚舉的符號(hào)與屬性也會(huì)被包括在格式化后的結(jié)果中。默認(rèn)為 false。
depth 指定格式化 object 時(shí)遞歸的次數(shù)。這對(duì)查看大型復(fù)雜對(duì)象很有用。默認(rèn)為 2。若要無限地遞歸則傳入 null。
colors 如果為 true,則輸出樣式使用 ANSI 顏色代碼。默認(rèn)為 false,可自定義。
customInspect 如果為 false,則 object 上自定義的 inspect(depth, opts) 函數(shù)不會(huì)被調(diào)用。默認(rèn)為 true。
showProxy 如果為 true,則 Proxy 對(duì)象的對(duì)象和函數(shù)會(huì)展示它們的 target 和 handler 對(duì)象。默認(rèn)為 false。
maxArrayLength 指定格式化時(shí)數(shù)組和 TypedArray 元素能包含的最大數(shù)量。默認(rèn)為 100。設(shè)為 null 則顯式全部數(shù)組元素。設(shè)為 0 或負(fù)數(shù)則不顯式數(shù)組元素。
breakLength 一個(gè)對(duì)象的鍵被拆分成多行的長度。設(shè)為 Infinity 則格式化一個(gè)對(duì)象為單行。默認(rèn)為 60。
例如,查看 util 對(duì)象的所有屬性:
const util = require('util');console.log(util.inspect(util, { showHidden: true, depth: null }));
復(fù)制代碼
2.util.callbackify(original)
util.callbackify(original)方法將 async 異步函數(shù)(或者一個(gè)返回值為 Promise 的函數(shù))轉(zhuǎn)換成遵循 Node.js 回調(diào)風(fēng)格的函數(shù)。在回調(diào)函數(shù)中, 第一個(gè)參數(shù) err 為 Promise rejected 的原因 (如果 Promise 狀態(tài)為 resolved , err為 null ),第二個(gè)參數(shù)則是 Promise 狀態(tài)為 resolved 時(shí)的返回值。例如:
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
復(fù)制代碼
注意:
回調(diào)函數(shù)是異步執(zhí)行的, 并且有異常堆棧錯(cuò)誤追蹤. 如果回調(diào)函數(shù)拋出一個(gè)異常, 進(jìn)程會(huì)觸發(fā)一個(gè) 'uncaughtException' 異常, 如果沒有被捕獲, 進(jìn)程將會(huì)退出。
null 在回調(diào)函數(shù)中作為一個(gè)參數(shù)有其特殊的意義, 如果回調(diào)函數(shù)的首個(gè)參數(shù)為 Promise rejected 的原因且?guī)в蟹祷刂? 且值可以轉(zhuǎn)換成布爾值 false, 這個(gè)值會(huì)被封裝在 Error 對(duì)象里, 可以通過屬性 reason 獲取。
return Promise.reject(null);
}
const callbackFunction = util.callbackify(fn);
callbackFunction((err, ret) => {
// 當(dāng)Promise的rejecte是null時(shí),它的Error與原始值都會(huì)被存儲(chǔ)在'reason'中。
err && err.hasOwnProperty('reason') && err.reason === null; // true
});
復(fù)制代碼
事件驅(qū)動(dòng) events
events是Node.js最重要的模塊,原因是Node.js本身架構(gòu)就是事件式的,大多數(shù) Node.js 核心 API 都采用慣用的異步事件驅(qū)動(dòng)架構(gòu),而它提供了唯一的接口,因此堪稱Node.js事件編程的及時(shí)。events 模塊不僅用于用戶代碼與 Node.js 下層事件循環(huán)的交互,還幾乎被所有的模塊依賴。
所有能觸發(fā)事件的對(duì)象都是 EventEmitter 類的實(shí)例。這些對(duì)象開放了一個(gè) eventEmitter.on() 函數(shù),允許將一個(gè)或多個(gè)函數(shù)綁定到會(huì)被對(duì)象觸發(fā)的命名事件上。事件名稱通常是駝峰式的字符串,但也可以使用任何有效的 JavaScript 屬性名。對(duì)于每個(gè)事件, EventEmitter支持 若干個(gè)事件監(jiān)聽器。當(dāng)事件發(fā)射時(shí),注冊(cè)到這個(gè)事件的事件監(jiān)聽器被依次調(diào)用,事件參數(shù)作 為回調(diào)函數(shù)參數(shù)傳遞。
例如:
const EventEmitter = require('events');class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
// eventEmitter.on() 方法用于注冊(cè)監(jiān)聽器
myEmitter.on('event', () => {
console.log('觸發(fā)了一個(gè)事件!');
});
// eventEmitter.emit() 方法用于觸發(fā)事件
myEmitter.emit('event');
復(fù)制代碼
下面讓我們來看看EventEmitter最常用的API:
EventEmitter.on(event, listener) 方法可以添加 listener 函數(shù)到名為 eventName 的事件的監(jiān)聽器數(shù)組的末尾。不會(huì)檢查 listener 是否已被添加。多次調(diào)用并傳入相同的 eventName 和 listener 會(huì)導(dǎo)致 listener 被添加與調(diào)用多次。
emitter.prependListener(eventName, listener)方法可以添加 listener 函數(shù)到名為 eventName 的事件的監(jiān)聽器數(shù)組的開頭。不會(huì)檢查 listener 是否已被添加。多次調(diào)用并傳入相同的 eventName 和 listener 會(huì)導(dǎo)致 listener 被添加與調(diào)用多次。
eventEmitter.emit() 方法允許將任意參數(shù)傳給監(jiān)聽器函數(shù)。當(dāng)一個(gè)普通的監(jiān)聽器函數(shù)被 EventEmitter 調(diào)用時(shí),標(biāo)準(zhǔn)的 this 關(guān)鍵詞會(huì)被設(shè)置指向監(jiān)聽器所附加的 EventEmitter。
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// 打印:
// b
// a
復(fù)制代碼
EventEmitter.once(event, listener) 為指定事件注冊(cè)一個(gè)單次監(jiān)聽器,即監(jiān)聽器最多只會(huì)觸發(fā)一次,觸發(fā)后立刻解除該監(jiān)聽器。
console.log('首次調(diào)用!');
});
復(fù)制代碼
EventEmitter.removeListener(event, listener) 移除指定事件的某個(gè)監(jiān)聽器, listener 必須是該事件已經(jīng)注冊(cè)過的監(jiān)聽器。(注意:removeListener 最多只會(huì)從監(jiān)聽器數(shù)組里移除一個(gè)監(jiān)聽器實(shí)例。如果任何單一的監(jiān)聽器被多次添加到指定 eventName 的監(jiān)聽器數(shù)組中,則必須多次調(diào)用 removeListener 才能移除每個(gè)實(shí)例。)
console.log('有連接!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
復(fù)制代碼
EventEmitter.removeAllListeners([event]) 移除所有事件的所有監(jiān)聽器,如果指定 event ,則移除指定事件的所有監(jiān)聽器
console.log('有連接!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
復(fù)制代碼
error 事件
EventEmitter 定義了一個(gè)特殊的事件 error ,它包含了“錯(cuò)誤”的語義,我們?cè)谟龅疆惓5臅r(shí)候通常會(huì)發(fā)射 error 事件。當(dāng) error被發(fā)射時(shí),EventEmitter規(guī)定如果沒有響 應(yīng)的監(jiān)聽器,Node.js 會(huì)把它當(dāng)作異常,退出程序并打印調(diào)用棧。我們一般要為會(huì)發(fā)射 error 事件的對(duì)象設(shè)置監(jiān)聽器,避免遇到錯(cuò)誤后整個(gè)程序崩潰。
var events = require('events');var emitter = new events.EventEmitter();
emitter.emit('error');
復(fù)制代碼
繼承EventEmitter
大多數(shù)情況下,我們不會(huì)直接使用EventEmitter,而是在對(duì)象中繼承它,包括fs,http在內(nèi)的只要是支持事件響應(yīng)的核心模塊都是EventEmitter的子類。這樣做的原因有以下兩個(gè):
具有某個(gè)實(shí)體功能的對(duì)象實(shí)現(xiàn)事件符合語義,事件的監(jiān)聽和發(fā)射應(yīng)該是一個(gè)對(duì)象的方法。
JavaScript 的對(duì)象機(jī)制是基于原型的,支持部分多重繼承,繼承 EventEmitter 不會(huì)打亂對(duì)象原有的繼承關(guān)系。
來源:https://juejin.cn/post/6844903586283913230
總結(jié)
以上是生活随笔為你收集整理的js console 输出到文件_Node.js核心入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python怎么开发软件_怎么使用pyt
- 下一篇: ggplot2箱式图两两比较_R绘图 第