var express = require("express");要導入 JavaScript文件,需要使用文件的路徑,如下所示:
var demo = require("./demo.js");21、npm的作用是什麼?
npm是同 Node .js一起安裝的包管理工具,能解決 Node. js代碼部署上的很多問題。常見的使用場景有以下幾種。
(1)允許用戶從npm伺服器下載別人編寫的第三方包到本地。
(2)允許用戶從npm伺服器下載並安裝別人編寫的命令行程序到本地。
(3)允許用戶將自己編寫的包或命令行程序上傳到npm伺服器供別人使用。
22、什麼是 EventEmitter?
EventEmitter是 Node. js中一個實現觀察者模式的類,主要功能是訂閱和發布消息,用於解決多模塊交互而產生的模塊之間的耦合問題.
23、如何實現一個 EventEmitter?
可通過3步實現 EventEmitter定義一個子類,通過寄生組合式繼承,繼承 EventEmitter
父類,代碼如下。
var Util= require('util' ); var EventEmitter= require ('events' ) .EventEmitter;function IcktEmitter () { EventEmitter .apply(this, arguments)}Util.inherits(IcktEmitter, EventEmitter);
var ie = new IcktEmitter ( ) ; ie.on('icketang', function(data){ console.log('接收到消息',data )})ie.emit(' icketang','來自有課網的消息');24、EventEmitter有哪些典型應用?
有以下應用。
(1)在模塊間傳遞消息。
(2)在回調函數內外傳遞消息。
(3)處理流數據,因為流是在 EventEmitter的基礎上實現的。
(4)運用觀察者模式收發消息的相關應用。
25、如何捕獲 EventEmitter的錯誤事件?
當發布error消息的時候,如果沒有註冊該事件,應用程式會拋出錯誤並中斷執行。所以要監聽error事件,代碼如下。
var ie= new IcktEmitter ( ); ie .on('error ', function(err){ conso1e.1og ( '接收到錯誤的信息',err )})ie.emit(' error','來自ie1的錯誤消息');26、Node. js中的流是什麼?
流(Stream)是基於 EventEmitter的數據管理模式,由各種不同的抽象接口組成,主要包括可寫、可讀、可讀寫、可轉換等類型。
27、使用流有什麼好處?
流是非阻塞式數據處理模式,可以提升效率,節省內存,有助於處理管道且可擴展等。
28、流有哪些典型應用?
流在文件讀寫、網絡請求、數據轉換、音頻、視頻等方面有很廣泛的應用。
29、如何捕獲流的錯誤事件?
監聽error事件,方法與訂閱 EventEmitter的error事件相似。
30、有哪些常用 Stream流?分別什麼時候使用?
Readable流為可讀流,在作為輸入數據源時使用;Writable流為可寫流,在作為輸岀源時使用;Duplex流為可讀寫流,它作為輸岀源被寫入,同時又作為輸入源被後面的流讀出。
Transform流和 Duplex流一樣,都是雙向流,區別是 Transfrom流只需要實現一個函數 _transfrom( chunk, encoding, callback);而 Duplex流需要分別實現_read(size )函數和_write( chunk, encoding, callback )函數。
31、如何實現一個 Writable流?
實現 Writable流分成3步
(1)引入 Writable模塊。
(2)繼承 Writable模塊。
(3)實現 _write(chunk, encoding, callback )寫入函數。
代碼如下。
//引入 Writable模塊var Writable= require('stream').Writable;var Util = require('util');//繼承 Writable模塊function IcktWritable( ) { Writable. apply(this, arguments ) ;}Util.inherits ( IcktWritable, Writable ) ;//實現 write函數IcktWritable. prototype. _write = function ( data, encoding, callback ) { console.log ('被寫入的數據是:' ,data. toString ( ) )callback ( )}var iw= new IcktWritable ( ) ;for (var i=0;i< 5 ;i++ ) {iw. write('有課網'+i,'utf8")}iw,end('學技能就上有課網' );32、內置的fs模塊架構由哪幾部分組成?
fs模塊主要由下面幾部分組成。
(1) POSIX文件 Wrapper,對應作業系統的原生文件操作。
(2)文件流,fs. createReadStream和 fs.createWriteStrean。
(3)同步文件讀寫, fs.readFileSync和fs.writeFileSync。
(4)異步文件讀寫, fs.readFile和fs.writeFile。
33、讀寫一個文件有多少種方法?
總體來說,有4種方法。
(1) POSIX式底層讀寫。
(2)流式讀寫。
(3)同步文件讀寫。
(4)異步文件讀寫。
34、如何讀取JSON配置文件?
主要有兩種方式。第一種是利用 Node. js內置的 require( data.json!)機制,直接得到 Javascript對象;
第二種是讀入文件內容,然後用JSON. parse( content)轉換成 JavaScript對象。
二者的區別是,對於第一種方式,如果多個模塊都加載了同一個JSON文件,那麼其中一個改變了 JavaScript對象,其他也跟著改變,這是由 Node.js模塊的緩存機製造成的,緩存中只有一個 JavaScript模塊對象;
第二種方式則可以隨意改變加載後的JavaScript變量,而且各模塊互不影響,因為它們都是獨立的,存儲的是多個 JavaScript對象。
35、fs.watch和 fs.watchFile有什麼區別?
二者主要用來監聽文件變動,fs.watch利用作業系統原生機制來監聽,可能不適用網絡文件系統;fs. watchFile則定期檢查文件狀態變更,適用於網絡文件系統,但是與fs.watch相比有些慢,因為它不採用實時機制。
36、為什麼需要子進程?
Node. js是異步非阻塞的,這對高並發非常有效。可是我們還有其他一些常用的需求,比如和作業系統 shell命令交互,調用可執行文件,創建子進程,進行阻塞式訪問或高CPU計算等,子進程就是為滿足這些需求而產生的。顧名思義,子進程就是把 Node. js阻塞的工作交給子進程去做。
37、exec、 execFile、 spawn和fork都是做什麼用的?
它們的作用分別如下。
exec可以用作業系統原生的方式執行各種命令,如管道 cat ab. txt | grep hello。
execFile用於執行一個文件。
spawn負責在流式和作業系統之間進行交互。
fork負責在兩個 Node. js程序( JavaScript)之間進行交互。
38、如何實現一個簡單的命令行交互程序?
實現代碼如下。
var cp = require (' child process );//執行指令var child= cp .spawn('echo', ['hello, ''] );// child.stdout是輸入流, process. stdout是輸出流//子進程的輸出流作為當前程序的輸入流,然後重定向到當前程序的控制器輸出child. stdout. pipe(process. stdout)39、兩個 Node. js程序之間如何交互?
通過fork實現父子程序之間的交互。子程序用 process.on、 process. send訪問父程序,父程序用 child.on、 child.send訪問子程序。
關於 parent. JS的示例代碼如下。
var cp = require (' child_process' ) ; var child= cp.fork ('./child. js' );child .on('message', function(msg){ console.1og('子程序發送的數據:',msg )})child.send ( '來自父程序發送的數據' )關於 child .js的示例代碼如下。
process .on ( 'message' , function(msg){conso1e.1og ( '父程序發送的數據: ' , msg )process.send ( '來自子程序發送的數據' )40、如何讓一個 JavaScript文件變得像 Linux命令一樣可執行?
具體步驟如下。
(1)在文件頭部加入#!/ bin/sh
如 icketang40.js#!/bin/shecho'有課網— 技能學習就上有課網;(2)用 chmod命令把名為 icketang40的 JavaScript文件改為可執行文件。
(3)進入文件目錄,在命令行輸入 icketang40.js就相當於執行 node icketang40.js
執行結果。
41、子進程和進程的 stdin、 stdout、 stderror是樣的嗎?
概念都是一樣的。stdin、 stdout、 stderror分別是輸入、輸出、錯誤。三者都是流。區別是在父進程裡,子進程的 stdout是輸入流, stdin是輸出流。
42、async都有哪些常用方法?分別怎麼用?
async是一個 JavaScript類庫,它的目的是解決 JavaScript中異常流程難以控制的問題。async不僅在 Node. js裡適用,還可以用在瀏覽器中。其常用方法和用法如下。
具體代碼如下所示。
var async = require('async ');var date = Date .now ( );(1) async. parallel:並行執行完多個函數後,調用結束函數。不用等到前一個函數。執行完再執行下一個函數。
async .parallel ( [ function ( callback ) { setTimeout (function () {console. log('process one', Date. now ( ) - date)callback(null, 'msg one')},2000)},function ( callback ){setTimeout ( function () {console. log('process tow', Date .now ( ) - date )callback ( null, 'msg tow' )},1000)}], function(err, result){ console. log(err, result, 'done ')})(2) async.series:串行執行完多個函數後,調用結束函數。前面一個函數執行完之後,就會立即執行下一個函數。
async .series ( [function ( callback ) {setTimeout ( function () {console. log ( 'process one ', Date. now ( ) - date )callback ( null, ' msg one' )},2000 )},function ( callback ) {setTimeout ( function () {console. log ( 'process tow', Date. now ( ) - date )callback ( null, 'msg tow ' )},1000 ) }] , function (err, result ) {console. log(err, result, 'done')})(3) async. waterfall:依次執行多個函數,前一個函數的執行結果作為後一個函數執行時的參數。
async .waterfall ( [function ( callback ) {setTimeout ( function () {console. log('process one, Date. now()- date)callback(null, 'msg one')},2000)},function(argl, callback){ setTimeout (function(){console. log('process tow, Date. now ( ) - date, argl )callback(null, 'msg tow')},1000)}] , function(err, result){console. log(err, result, 'done ')})43、express項目的目錄大致是什麼結構的?
首先,執行安裝 express的指令:npm install express-generator-g。
然後,通過 express指令創建項目:express icketang。
創建的項目目錄結構如下。
./app.js 應用核心配置文件(入口文件)
./bin 存放啟動項目的腳本文件
./ package.json 存儲項目的信息及模塊依賴
./public 靜態文件(css、js、img等)
./routes 路由文件(MVC中的 contro1ler)
./views 頁面文件(jade模板)
44、express常用函數有哪些?
常用函數有以下幾個
express .Router—路由組件
app.get—路由定向。
app. configure——配置。
app.set一設定參數。
app.use——使用中間件。
45、express中如何獲取路由的參數?
執行的命令如下
使用 req.params.name來獲取;使用req.body.username來獲得表單傳入參數 username;express的路由支持常用通配符有?、+、*、( )。
46、express response有哪些常用方法?
常用方法有以下幾個。
res. download( ),彈出文件下載。
res.end ( ),結束響應。
res.json( ),返回json。
res.jsonp( ),返回 jsonp。
res .redirect ( ),重定向請求。
res .render ( ),渲染模板。
res.send ( ),返回多種形式數據。
res.sendFile ( ),返回文件。
res.sendStatus( ),返回狀態。
47、mongodb有哪些常用優化措施?
常用優化措施如下。
(1)優化預讀。
(2)禁用NUMA。
(3)不要記錄訪問時間等。
48、Redis的主要特點是什麼?
主要特點如下。
(1) Redis支持數據的持久化,可以將內存中的數據保存在磁碟中,重啟的時候可以再次加載和使用。
(2) Redis不僅支持簡單的鍵-值類型的數據,同時還提供list、set、zset、hash等數據結構的存儲。
(3) Redis支持數據的備份,即主-從模式的數據備份。
49、Nginx和 Apache有什麼區別?
Nginx是輕量級的,同樣的Web服務在 nginx中會佔用更少的內存和資源。Nginx抗並發,處理請求的方式是異步非阻塞的,負載能力比 Apache高很多,而 Apache則是阻塞型的。
在高並發下 Nginx能保持低資源、低消耗、高性能,並且處理靜態文件比 Apache好。
Nginx的設計高度模塊化,編寫模塊相對簡單,配置簡潔。作為負載均衡伺服器,支持7層負載均衡,是一個反向代理伺服器。
社區活躍,各種高性能模塊出品迅速。Apache的 rewrite比 Nginx強大,模塊豐富。Apache發展得更為成熟,Bug很少,更加穩定。
Apache對PHP的支持比較簡單, Nginx需要配合其他後端使用。Apache處理動態請求有優勢,擁有豐富的特性、成熟的技術和開發社區。
50、說說線程與進程的區別。
(1)一個程序至少有一個進程,一個進程至少有一個線程
(2)線程的劃分尺度小於進程,使得多線程程序的並發性高。
(3)進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,極大地提高了程序的運行效率。
(4)線程在執行過程中與進程有區別。每個獨立的線程都有程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個線程執行控制。
(5)從邏輯角度來看,多線程的意義在於一個應用程式中,有多個執行部分可以同時執行。但作業系統並沒有將多個線程看作多個獨立的應用來實現進程的調度、管理和資源分配。這是進程和線程的主要區別。
51、你知道哪些 Node.js核心模塊?
EventEmitter 、Stream、FS、Net和全局對象等。
52、說說 MySQL和 MongoDB的區別。
(1) MySQL是傳統的關係型資料庫, MongoDB則是非關係型資料庫。
(2) MongoDB以BSON結構進行存儲,在存儲海量數據方面有著很明顯的優勢。
(3)與傳統關係型資料庫相比, NoSQL有著非常顯著的性能和擴展性優勢。
(4)與傳統的關係型資料庫(如與 MySQL)相比, MongoDB的優點如下。
弱一致性(最終一致),更能保證用戶的訪問速度。
使用文檔結構的存儲方式,能夠更便捷地獲取數據。
53、談談棧和堆的區別。
區別如下:
(1)棧( stack)區由編譯器自動分配和釋放,存放函數的參數值、局部變量的值等。
堆(heap)區一般由程式設計師分配和釋放,若程式設計師不釋放,程序結束時可能由OS回收。
(2)堆(數據結構)可以被看成一棵樹,如堆排序。棧(數據結構)是一種先進後出的數據結構。
推薦閱讀
【前端面試題】—18道有關混合開發的面試題(附答案)
【前端面試題】—21道有關移動端的面試題(附答案)