您好,登錄后才能下訂單哦!
這篇文章主要介紹了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? **
EventEmitter
是node
中一個實現觀察者模式的類,主要功能是監聽和發射消息,用于處理多模塊交互問題.
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.createReadStream
和fs.createWriteStream
3) 同步文件讀寫,fs.readFileSync
和fs.writeFileSync
4) 異步文件讀寫, fs.readFile
和fs.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) memwatch
和heapdump
獲得內存快照進行對比,查找內存溢出
**41、有哪些常用方法可以防止程序崩潰? **
1) try-catch-finally
2) EventEmitter/Stream error
事件處理
3) domain
統一控制
4) jshint
靜態檢查
5) jasmine/mocha
進行單元測試
42、怎樣調試node程序?
node --debug app.js
和node-inspector
43、async都有哪些常用方法,分別是怎么用?
async
是一個js
類庫,它的目的是解決js
中異常流程難以控制的問題.async
不僅適用在node.js
里,瀏覽器中也可以使用.
1) async.parallel
并行執行完多個函數后,調用結束函數
async.parallel([ function(){ ... }, function(){ ... } ], callback);
async.series
串行執行完多個函數后,調用結束函數async.series([ function(){ ... }, function(){ ... } ]);
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' });
async.map
異步執行多個數組,返回結果數組async.map(['file1','file2','file3'], fs.stat, function(err, results){ // results is now an array of stats for each file });
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()
結束responseres.json()
返回json 在這里插入代碼片
res.jsonp()
返回jsonpres.redirect()
重定向請求res.render()
渲染模板res.send()
返回多種形式數據res.sendFile
返回文件res.sendStatus()
返回狀態
48、mongodb有哪些常用優化措施
類似傳統數據庫,索引和分區
49、mongoose是什么?有支持哪些特性?mongoose
是mongodb
的文檔映射模型.主要由Schema
, Model
和Instance
三個方面組成.Schema
就是定義數據類型,Model
就是把Schema
和js
類綁定到一起,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的前端面試題有哪些內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。