Node的事件處理和readline模塊詳解
一、Node的事件處理
1、采用事件驅(qū)動(dòng)模型
2、Node是單線程的,采用事件輪詢方式來處理事件
3、事件機(jī)制中的三個(gè)角色:
事件(Event)、事件發(fā)生器(EventEmitter)、事件監(jiān)聽器(EventListener)
const http = require('http');
//創(chuàng)建服務(wù)器對(duì)象
let server = http.createServer();
//給服務(wù)器對(duì)象綁定事件request
server.once('request',function (req,res){
console.log('----request-1----')
})
server.on('request',function (req,res) {
console.log('請(qǐng)求地址:',req.url)
res.end('Hello World')
})
server.once('request',function (req,res) {
console.log('---- Response End ----')
})
//服務(wù)器啟動(dòng)監(jiān)聽
server.listen(8089,'127.0.0.1')
//在網(wǎng)址處查找http://127.0.0.1:8089
// ----request-1----
// 請(qǐng)求地址: /
// ---- Response End ----
// 請(qǐng)求地址: /favicon.ico
//頁面處顯示Hello Worldconst EventEmitter = require('events').EventEmitter;
const emitter = new EventEmitter();
emitter.on('beep',function (){ //先執(zhí)行這個(gè)回調(diào)函數(shù),輸出beep
console.log('beep')
})
emitter.on('beep',function (){ //然后再執(zhí)行這個(gè)回調(diào)函數(shù),拋出一個(gè)錯(cuò)誤,會(huì)被catch接收到
throw Error('oops!'); //因?yàn)檫@個(gè)函數(shù)執(zhí)行完之后,發(fā)生異常,已經(jīng)被扔出去,所以后面的函數(shù)就不會(huì)再被執(zhí)行
})
emitter.on('beep',function (){
console.log('beep again!');
})
//手動(dòng)觸發(fā)事件
try{
emitter.emit('beep')
}catch (e) {
console.log(e.message) //e.message指得就是Error對(duì)象。message對(duì)應(yīng)的就是error對(duì)象的字符串(oops)
}
// beep
// oops!二、通過Node的readline模塊實(shí)現(xiàn)終端的輸入
1、標(biāo)準(zhǔn)輸入輸出:鍵盤、鼠標(biāo)、顯示器
2、使用方法
(1)引入:require('readline')
(2)創(chuàng)建readline對(duì)象(接口)
(3)調(diào)用接口的相關(guān)方法
(4)監(jiān)聽和處理readline事件
onst readline = require('readline');
//創(chuàng)建readline實(shí)例(接口對(duì)象)
let r1 = readline.createInterface({
input: process.stdin,
output : process.stdout
})
//調(diào)用接口方法
r1.question("請(qǐng)輸入姓名:",function (answer) { //有一個(gè)輸入提示,輸入數(shù)據(jù)后,會(huì)開始調(diào)用回調(diào)函數(shù)
console.log("姓名是:",answer) //將輸入的字符串,賦給回調(diào)函數(shù)的參數(shù)answer,然后輸出
r1.close() //用r1這個(gè)方法去觸發(fā)這個(gè)close事件
})
//給readline實(shí)例綁定close事件
r1.on('close',function (){ //事件觸發(fā)后,整個(gè)進(jìn)程才能結(jié)束
process.exit(0)
})
// 請(qǐng)輸入姓名:云汐(云汐需要自己手動(dòng)輸入后,點(diǎn)擊回車)
// 姓名是: 云汐const readline = require('readline');
const r1 = readline.createInterface(process.stdin,process.stdout);
r1.setPrompt('Test>'); //方法setPromat(promat) ,就是給每一行設(shè)置一個(gè)提示符,
//就好比window命令行的> ,這里設(shè)置的是Test>
r1.prompt(); //prompt()是最重要的方法,因?yàn)樗w現(xiàn)了readline的核心作用,
//以行為單位讀取數(shù)據(jù),prompt方法就是在等待用戶輸入數(shù)據(jù)
r1.on('line',function (line){ //監(jiān)聽了'line' 事件,因?yàn)閜rompt方法調(diào)用一次就只會(huì)讀取一次數(shù)據(jù)
switch (line.trim()){
case 'copy':
console.log('復(fù)制');
break;
case 'hello':
console.log('world')
break
case 'close':
r1.close()
break
default:console.log('沒有找到命令')
break
}
r1.prompt() //所以,在這個(gè)方法又調(diào)用了一次prompt方法,這樣就可以繼續(xù)讀取用戶輸入,從而達(dá)到一種命令行的效果
});
r1.on('close',function (){
console.log('bye bye');
process.exit(0)
})總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
node故障定位頂級(jí)技巧動(dòng)態(tài)追蹤Dynamic?Trace詳解
這篇文章主要為大家介紹了node故障定位頂級(jí)技巧動(dòng)態(tài)追蹤Dynamic?Trace詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
jwt在express中token的加密解密實(shí)現(xiàn)過程
文章詳細(xì)介紹了JWT在Node.js中的生成和驗(yàn)證過程,包括設(shè)置密鑰、使用中間件進(jìn)行token驗(yàn)證等步驟,并提供了一個(gè)完整的示例代碼,感興趣的朋友跟隨小編一起看看吧2025-01-01
Node.JS中快速掃描端口并發(fā)現(xiàn)局域網(wǎng)內(nèi)的Web服務(wù)器地址(80)
在 Node.JS 中進(jìn)行端口掃描還是比較方便的,一般會(huì)有廣播和輪詢兩種方式。下文重點(diǎn)給大家介紹node.js 掃描端口并發(fā)現(xiàn)局域網(wǎng)內(nèi)的web服務(wù)器地址的方法,一起看看吧2017-09-09

