中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Node的前端面試題有哪些

發布時間:2020-12-11 09:56:21 來源:億速云 閱讀:415 作者:小新 欄目:web開發

這篇文章主要介紹了Node的前端面試題有哪些,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

Node前端面試題

**1. 為什么要用node? **

特點:簡單強大,輕量可擴展.簡單體現在node使用的是javascript,json來進行編碼,人人都會;
強大體現在非阻塞IO,可以適應分塊傳輸數據,較慢的網絡環境,尤其擅長高并發訪問;輕量體現在node本身既是代碼,又是服務器,前后端使用統一語言;可擴展體現在可以輕松應對多實例,多服務器架構,同時有海量的第三方應用組件

2. node的構架是什么樣子的?

主要分為三層,應用app >> V8及node內置架構 >> 操作系統.
V8是node運行的環境,可以理解為node虛擬機.node內置架構又可分為三層: 核心模塊(javascript實現) >> c++綁定 >> libuv + CAes + http.

3. node有哪些核心模塊?

EventEmitter, Stream, FS, Net和全局對象

4、node有哪些全局對象?

process, console, Buffer和exports

5、 process有哪些常用方法?

process.stdin, process.stdout, process.stderr, process.on, process.env, process.argv, process.arch, process.platform, process.exit

6、console有哪些常用方法?

console.log/console.info, console.error/console.warning, console.time/console.timeEnd, console.trace, console.table

7、node有哪些定時功能?

setTimeout/clearTimeout, setInterval/clearInterval, setImmediate/clearImmediate, process.nextTick

8、node中的事件循環是什么樣子的?

總體上執行順序是:process.nextTick >> setImmidate >> setTimeout/SetInterval
鏈接

9、node中的Buffer如何應用?

Buffer是用來處理二進制數據的,比如圖片,mp3,數據庫文件等.Buffer支持各種編碼解碼,二進制字符串互轉.

**10、什么是EventEmitter? **

EventEmitternode中一個實現觀察者模式的類,主要功能是監聽和發射消息,用于處理多模塊交互問題.

11、如何實現一個EventEmitter?

主要分三步:定義一個子類,調用構造函數,繼承EventEmitter

代碼演示

var util = require(‘util’);
var EventEmitter = require(‘events’).EventEmitter;

function MyEmitter() { 
    EventEmitter.call(this); 
} // 構造函數 

util.inherits(MyEmitter, EventEmitter); // 繼承 

var em = new MyEmitter(); 
em.on('hello', function(data) { 
    console.log('收到事件hello的數據:', data); 
}); // 接收事件,并打印到控制臺 
em.emit('hello', 'EventEmitter傳遞消息真方便!');

12、EventEmitter有哪些典型應用?

1) 模塊間傳遞消息
2) 回調函數內外傳遞消息
3) 處理流數據,因為流是在EventEmitter基礎上實現的.
4) 觀察者模式發射觸發機制相關應用

13、怎么捕獲EventEmitter的錯誤事件?

監聽error事件即可.如果有多個EventEmitter,也可以用domain來統一處理錯誤事件.

代碼演示

var domain = require('domain'); 
var myDomain = domain.create(); 
myDomain.on('error', function(err){ 
    console.log('domain接收到的錯誤事件:', err); 
}); // 接收事件并打印 
myDomain.run(function(){ 
    var emitter1 = new MyEmitter(); 
    emitter1.emit('error', '錯誤事件來自emitter1'); 
    emitter2 = new MyEmitter(); 
    emitter2.emit('error', '錯誤事件來自emitter2'); 
});

14、EventEmitter中的newListenser事件有什么用處?
newListener可以用來做事件機制的反射,特殊應用,事件管理等.當任何on事件添加到EventEmitter時,就會觸發newListener事件,基于這種模式,我們可以做很多自定義處理.

代碼演示

var emitter3 = new MyEmitter();
emitter3.on('newListener', function(name, listener) {
    console.log("新事件的名字:", name); 
    console.log("新事件的代碼:", listener); 
    setTimeout(function(){ console.log("我是自定義延時處理機制"); }, 1000); 
});
emitter3.on('hello', function(){
    console.log('hello node'); 
});

**15、什么是Stream? **

stream是基于事件EventEmitter的數據管理模式.由各種不同的抽象接口組成,主要包括可寫,可讀,可讀寫,可轉換等幾種類型.

16、Stream有什么好處?

非阻塞式數據處理提升效率,片斷處理節省內存,管道處理方便可擴展等.

17、Stream有哪些典型應用?

文件,網絡,數據轉換,音頻視頻等

18、怎么捕獲Stream的錯誤事件?

監聽error事件,方法同EventEmitter

**19、有哪些常用Stream,分別什么時候使用? **

Readable為可被讀流,在作為輸入數據源時使用;Writable為可被寫流,在作為輸出源時使用;Duplex為可讀寫流,它作為輸出源接受被寫入,同時又作為輸入源被后面的流讀出.Transform機制和Duplex一樣,都是雙向流,區別時Transfrom只需要實現一個函數_transfrom(chunk, encoding, callback);Duplex需要分別實現_read(size)函數和_write(chunk, encoding, callback)函數.

**20、實現一個Writable Stream? **

三步走:1)構造函數call Writable

2) 繼承Writable 在這里插入代碼片
3) 實現_write(chunk, encoding, callback)函數

代碼演示

var Writable = require('stream').Writable;
var util = require('util');
 
function MyWritable(options) {
    Writable.call(this, options); 
} // 構造函數 
util.inherits(MyWritable, Writable); // 繼承自Writable 
MyWritable.prototype._write = function(chunk, encoding, callback) {
    console.log("被寫入的數據是:", chunk.toString()); // 此處可對寫入的數據進行處理 
    callback(); 
};
 
process.stdin.pipe(new MyWritable()); // stdin作為輸入源,MyWritable作為輸出源

21、內置的fs模塊架構是什么樣子的?

fs模塊主要由下面幾部分組成:

1) POSIX文件Wrapper,對應于操作系統的原生文件操作
2) 文件流 fs.createReadStreamfs.createWriteStream
3) 同步文件讀寫,fs.readFileSyncfs.writeFileSync
4) 異步文件讀寫, fs.readFilefs.writeFile

**22、讀寫一個文件有多少種方法? **

1) POSIX式低層讀寫
2) 流式讀寫
3) 同步文件讀寫
4) 異步文件讀寫

23、怎么讀取json配置文件?

第一種是利用node內置的require('data.json')機制,直接得到js對象;
第二種是讀入文件入內容,然后用JSON.parse(content)轉換成js對象.二者的區別是require機制情況下,如果多個模塊都加載了同一個json文件,那么其中一個改變了js對象,其它跟著改變,這是由node模塊的緩存機制造成的,只有一個js模塊對象; 第二種方式則可以隨意改變加載后的js變量,而且各模塊互不影響,因為他們都是獨立的,是多個js對象.

24、fs.watch和fs.watchFile有什么區別,怎么應用?

fs.watch利用操作系統原生機制來監聽,可能不適用網絡文件系統; fs.watchFile則是定期檢查文件狀態變更,適用于網絡文件系統,但是相比fs.watch有些慢,因為不是實時機制.

25、node的網絡模塊架構是什么樣子的?

node全面支持各種網絡服務器和客戶端,包括tcp, http/https, tcp, udp, dns, tls/ssl等.

26、node是怎樣支持https,tls的?

1) openssl生成公鑰私鑰
2) 服務器或客戶端使用https替代http
3) 服務器或客戶端加載公鑰私鑰證書

27、實現一個簡單的http服務器?

思路是加載http模塊,創建服務器,監聽端口.

代碼演示

var http = require('http'); // 加載http模塊 

http.createServer(function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/html'}); // 200代表狀態成功, 文檔類型是給瀏覽器識別用的 
    res.write('<meta charset="UTF-8"><h2>我是標題啊!</h2><font color="red">這么原生,初級的服務器,下輩子能用著嗎?!</font>'); // 返回給客戶端的html數據 
    res.end(); // 結束輸出流 
}).listen(3000); // 綁定3ooo, 查看效果請訪問 http://localhost:3000

**28、為什么需要child-process? **

node是異步非阻塞的,這對高并發非常有效.可是我們還有其它一些常用需求,比如和操作系統shell命令交互,調用可執行文件,創建子進程進行阻塞式訪問或高CPU計算等,child-process就是為滿足這些需求而生的.child-process顧名思義,就是把node阻塞的工作交給子進程去做.

29、exec,execFile,spawn和fork都是做什么用的?

exec可以用操作系統原生的方式執行各種命令,如管道 cat ab.txt | grep hello;
execFile是執行一個文件;
spawn是流式和操作系統進行交互;
fork是兩個node程序(javascript)之間時行交互.

30、實現一個簡單的命令行交互程序?

spawn

代碼演示

var cp = require('child_process'); 

var child = cp.spawn('echo', ['你好', "鉤子"]); // 執行命令 
child.stdout.pipe(process.stdout); // child.stdout是輸入流,process.stdout是輸出流 
// 這句的意思是將子進程的輸出作為當前程序的輸入流,然后重定向到當前程序的標準輸出,即控制臺

**31、兩個node程序之間怎樣交互? **

用fork嘛,上面講過了.原理是子程序用process.on, process.send,父程序里用child.on,child.send進行交互.

代碼演示

1) fork-parent.js 
var cp = require('child_process'); 
var child = cp.fork('./fork-child.js'); 
child.on('message', function(msg){ 
    console.log('老爸從兒子接受到數據:', msg); 
}); 
child.send('我是你爸爸,送關懷來了!'); 

2) fork-child.js 
process.on('message', function(msg){ 
    console.log("兒子從老爸接收到的數據:", msg); 
    process.send("我不要關懷,我要銀民幣!"); 
});

**32、怎樣讓一個js文件變得像linux命令一樣可執行? **

1) 在myCommand.js文件頭部加入#!/usr/bin/env node
2) chmod命令把js文件改為可執行即可
3) 進入文件目錄,命令行輸入myComand就是相當于node myComand.js

33、child-process和process的stdin,stdout,stderror是一樣的嗎?

概念都是一樣的,輸入,輸出,錯誤,都是流.區別是在父程序眼里,子程序的stdout是輸入流,stdin是輸出流

34、node中的異步和同步怎么理解

node是單線程的,異步是通過一次次的循環事件隊列來實現的.同步則是說阻塞式的IO,這在高并發環境會是一個很大的性能問題,所以同步一般只在基礎框架的啟動時使用,用來加載配置文件,初始化程序什么的

**35、有哪些方法可以進行異步流程的控制? **

1) 多層嵌套回調
2) 為每一個回調寫單獨的函數,函數里邊再回調
3) 用第三方框架比方async, q, promise

36、怎樣綁定node程序到80端口?

1) sudo
2) apache/nginx代理
3) 用操作系統的firewall iptables進行端口重定向

37、有哪些方法可以讓node程序遇到錯誤后自動重啟?

1) runit
2) forever
3) nohup npm start &

38、怎樣充分利用多個CPU?

一個CPU運行一個node實例

39、怎樣調節node執行單元的內存大小?

--max-old-space-size--max-new-space-size 來設置 v8 使用內存的上限

**40、程序總是崩潰,怎樣找出問題在哪里? **

1) node --prof 查看哪些函數調用次數多
2) memwatchheapdump獲得內存快照進行對比,查找內存溢出

**41、有哪些常用方法可以防止程序崩潰? **

1) try-catch-finally
2) EventEmitter/Stream error事件處理
3) domain統一控制
4) jshint靜態檢查
5) jasmine/mocha進行單元測試

42、怎樣調試node程序?

node --debug app.jsnode-inspector

43、async都有哪些常用方法,分別是怎么用?

async是一個js類庫,它的目的是解決js中異常流程難以控制的問題.async不僅適用在node.js里,瀏覽器中也可以使用.
1) async.parallel并行執行完多個函數后,調用結束函數

async.parallel([ 
    function(){ ... }, 
    function(){ ... } 
], callback);
  1. async.series串行執行完多個函數后,調用結束函數
async.series([ 
    function(){ ... }, 
    function(){ ... } 
 ]);
  1. async.waterfall依次執行多個函數,后一個函數以前面函數的結果作為輸入參數
async.waterfall([ 
   function(callback) { 
       callback(null, 'one', 'two'); 
   }, 
   function(arg1, arg2, callback) { 
     // arg1 now equals 'one' and arg2 now equals 'two' 
       callback(null, 'three'); 
   }, 
   function(arg1, callback) { 
       // arg1 now equals 'three' 
       callback(null, 'done'); 
   } 
], function (err, result) { 
   // result now equals 'done' 
});
  1. async.map異步執行多個數組,返回結果數組
async.map(['file1','file2','file3'], fs.stat, function(err, results){ 
  // results is now an array of stats for each file 
});
  1. async.filter異步過濾多個數組,返回結果數組
async.filter(['file1','file2','file3'], fs.exists, function(results){ 
  // results now equals an array of the existing files 
});

44、express項目的目錄大致是什么樣子的

app.js, package.json, bin/www, public, routes, views.

45、express常用函數
express.Router路由組件,app.get路由定向,app.configure配置,app.set設定參數,app.use使用中間件

46、express中如何獲取路由的參數
/users/:name使用req.params.name來獲取;
req.body.username則是獲得表單傳入參數username;
express路由支持常用通配符 ?, +, *, and ()

47、express response有哪些常用方法
res.download() 彈出文件下載
res.end() 結束response
res.json() 返回json 在這里插入代碼片
res.jsonp() 返回jsonp
res.redirect() 重定向請求
res.render() 渲染模板
res.send() 返回多種形式數據
res.sendFile 返回文件
res.sendStatus() 返回狀態

48、mongodb有哪些常用優化措施
類似傳統數據庫,索引和分區

49、mongoose是什么?有支持哪些特性?
mongoosemongodb的文檔映射模型.主要由Schema, ModelInstance三個方面組成.
Schema就是定義數據類型,
Model就是把Schemajs類綁定到一起,
Instance就是一個對象實例.
常見mongoose操作有,save, update, find. findOne, findById, static方法等

50、redis支持哪些功能

set/get, mset/hset/hmset/hmget/hgetall/hkeys, sadd/smembers, publish/subscribe, expire

51、redis最簡單的應用

var redis = require("redis"), 
   client = redis.createClient(); 

client.set("foo_rand000000000000", "some fantastic value"); 
client.get("foo_rand000000000000", function (err, reply) { 
   console.log(reply.toString()); 
}); 
client.end();

52、apache,nginx有什么區別?
二者都是代理服務器,功能類似.
apache應用簡單,相當廣泛.
nginx在分布式,靜態轉發方面比較有優勢

感謝你能夠認真閱讀完這篇文章,希望小編分享Node的前端面試題有哪些內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

井研县| 德化县| 夏津县| 周宁县| 金山区| 乌拉特后旗| 台北市| 安图县| 巧家县| 临夏县| 木兰县| 栖霞市| 思茅市| 华池县| 哈密市| 类乌齐县| 沭阳县| 苏州市| 朝阳县| 湖州市| 宜昌市| 日照市| 太白县| 南雄市| 黄山市| 尚志市| 黄平县| 新干县| 阿鲁科尔沁旗| 始兴县| 金秀| 寿宁县| 崇州市| 柏乡县| 沾益县| 金塔县| 东辽县| 郓城县| 渝中区| 内黄县| 遂川县|