❶ 如何在創建的nodejs伺服器下運行html
首先實現一個處理靜態資源的函數,其實就是對本地文件的讀取操作,這個方法回已滿足了上答面說的靜態資源的處理。
//處理靜態資源
function staticResHandler(localPath, ext, response) {
fs.readFile(localPath, "binary", function (error, file) {
if (error) {
response.writeHead(500, { "Content-Type": "text/plain" });
response.end("Server Error:" + error);
} else {
response.writeHead(200, { "Content-Type": getContentTypeByExt(ext) });
response.end(file, "binary");
}
});
}
❷ nodejs內置模塊有哪些
一、Express框架
前面的章節已經介紹過了,可以使用npm來安裝node.js模塊。具體操作請參照以前寫的nodejs概論。
Express是一個nodejs的web開源框架,用於快速的搭建web項目。其主要集成了web的http伺服器的創建、靜態文本管理、伺服器URL地址請求處理、get和post請求處理分發、session處理等功能。
使用方法,在cmd中打開你所想創建web項目的路徑。然後輸入
Express appname
即可創建一個名為appname的web項目。控制台列印結果
在jada文件中是可以使用for循環和if判斷語句的,可以讓你體會類似JSP的<%%>和php的<php></php>在網頁上輸出數據的快感。
三、forever模塊
nodejs作為http伺服器,需要確保服務順利進行,要注意一下兩點:
1.後台服務運行,監控運行日誌,以及http運行日誌;
2.確保項目的正常安全運行,Node.js的啟動命令node,很大程度無法滿足運行需求;
Node.js的forever模塊在第二點就可以起到很大的作用,同時其擁有監控文件更改、自動重啟等功能。
forever模塊的使用方法有兩種:1.在命令行中使用
forever -l forever.log -o out.log -e err.log app.js
-l forever.log -o out.log -e err.log分別指定了forever的運行日誌,腳本流水日誌,腳本運行錯誤日誌,啟動後將在本文件夾下產生out.log、err.log文件。
2.在編碼中require forever模塊使用。
四、Socket.IO模塊
Socket.IO模塊主要功能是將WebSocket協議應用到所有瀏覽配廳器。主要用於實時的長連接多求情項目中。
例如:在線聯網游戲,實時聊天、實時股票查看、二維碼掃描登錄掘粗等。
安裝方法仍然是在cmd在中輸入npm install socket.io
如何使用Socket.IO來創建一個項目。
需要分別實現服務端和客戶端的邏輯:
先創建一個服務端的node.js腳本index_server.js
var app = require('http').createServer(handler)//創建伺服器app
, io = require('socket.io').listen(app)//引用socket.io模塊監聽app
, fs = require('fs')//引用文件處理模塊
app.listen(80);//指定app監聽的埠,第二個參數127.0.0.1可省略
function handler (req, res) {
fs.readFile(__dirname + '/index.html', function (err, data) { if (err) {
res.writeHead(500); return res.end('Error loading index.html');
}
res.writeHead(200);
res.end(data);
});
}
io.sockets.on('connection', function (socket) {
socket.emit('判賣鎮news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
其中,socket.emit()為Socket發送消息的函數,第一個參數表示發送消息的key值,第二個參數為發送消息的內容,也就是發送的數據。
Socket。on()為Socket接收消息的函數,第一個參數為接收消息的可以值,第二個參數為回調函數,其中回調函數攜帶的參數為接收消息所發送的數據。
接下來web前端如何使用javaScrit 來連接Socket伺服器。
新建一個index_client.html
<script type="text/javascript" src="socket.js"></script>
<script type="text/javascript"> var socket = io.connect('http://localhost');//創建本地sock連接
socket.on('news',function (data) {//Socket接收news消息時執行回調函數 console.log(data);
socket.emit('my other event',{my:'data'});
});</script>
<script type="text/javascript" src="socket.js"></script>載入已經安裝好的Socket.io的本地JavaScrit文件。
var socket = io.connect('http://localhost');因為埠為80,所有這里可以不埠號
socket.on('news',function (data){}//客戶端接收news消息成功後,發送my other event消息到服務端,發送的消息內容為json對象{my:'data'}
接下來只需要運行服務端的index_server.js文件來啟動socket服務
效果:在瀏覽器輸入http://127.0.0.1按F12調出瀏覽器的控制台console即可看見列印出了一個object對象。
執行完畢後可能會報錯:catnot find mole socket.io,說明你的socket.IO沒有安裝,或已經安裝並配置為全局,但你的安裝路徑並沒有配置到在path中,所有無法引用。
你可以選擇配置path,或者安裝到項目內。這里建議安裝到你的項目目錄下,而不是簡單粗暴的配置為全局。先卸載npm uninstall socket.io 進入指定目錄後安裝node index_server.js
socket.io詳細請參閱 http://cnodejs.org/topic/50a1fcc7637ffa4155b5a264
五、request模塊
request模塊為開發者提供了一種簡單訪問HTTP請求的方法。request還支持HTTPS的訪問方法。
安裝:
npm install requset
request模塊基本上覆蓋了所有的HTTP請求方式如GET,POST,HEAD,DEL等。但其最基本的兩個方法是request.get()和request.post().
get和post的區別
get:
1.使用get向伺服器發出和接收的請求會附在url之後。類似:http://www..com?id=1221&name=5555這個url中傳遞了兩個參數,一個為id,一個為name。
2.get請求不能超過1024個位元組。
post沒有限制,也不會附在url上。
接下來做一個簡單的實例
get實例:
首先新建一個伺服器app_get.js
var http= require("http");
http.createServer(function(req,res){
res.writeHead(200,{'content-Type':'text/plain'});
res.end('Hello world
'+req.method);
}).listen(1337,"127.0.0.1");
再建一個發送求情的request_get.js文件
var request=require('request');
request.get("http://127.0.0.1:1337",function(error,response,result){
console.log(result);
});
在CMD中運行app_get.js,運行成功後,再打開一個cmd(之前的cmd不要關閉),執行request_get.js文件。
執行後的結果如下
hello world
GET
可以看出,通過request.get方法訪問
http://127.0.0.1:1337 返回的結果就是res.end()的參數
post實例:
和上面一樣,先新建伺服器app_post.js
var http= require("http"),
querystring=require('querystring');
http.createServer(function(req,res){ var postData=""; //開始非同步接收客戶端post的數據
req.addListener("data",function (postDataChunk) {
postData += postDataChunk;
}); //非同步post數據接收完畢後執行匿名回調函數
req.addListener("end",function(){ var postStr=JSON.stringify(querystring.parse(postData));
res.writeHead(200,{'content-Type':'text/plain'});
res.end(postStr+'
'+req.method);
});
}).listen(1400,"127.0.0.1");
然後再新建一個request_post.js
var request=require("request");
request.post('http://127.0.0.1:1400',{form:{'name':'ermu','book':'node.js'}},function (error,response,result) {
console.log(result);
})
像上面一樣在cmd中執行後顯示的結果如下:
D:
odejssrc
equest>node request_post.js
{"name":"ermu","book":"node.js"}
POST
request post提交了一個json對象{"name":"ermu","book":"node.js"}而伺服器接通過獲取該POST數據,然後返回客戶端,同時將http請求方式也響應到客戶端。
request post參數可以有兩種傳遞方式。
其中,第一種是將url和form表單的數據作為json參數在request post傳遞。舉例如下:
request.post('url':'http://127.0.0.1:1400',form:{'name':'ermu','book':'node.js'}},function (error,response,result) {
console.log(result);
})
另一種是將url和form作為兩個參數,上面的實例就是使用這種方法。
六、 Formidable模塊
該模塊的目的是為了解決文件上傳。
在原生的node.js模塊中,提供了獲取post數據的方法,但是並沒有直接獲取上傳文件。
❸ nodejs有哪些優點和缺點
一、說的最多的問題:生態。fibjs 作為新興的開發框架,生態必定會是原始的。並且因為顛覆了 nodejs 的範式,所以也不太能直接借用 npm 的生態。雖然很多 npm 組件其實是可以直接使用的,但是更多人需要的 web/db/io 相關組件一概不可用。沒有英文文檔,在把 fibjs 推向國外社區上乏力,也進一步限制了生態的發展。
二、fiber 相比 callback 而言的唯一缺點是堆棧內存佔用。golang 採取增長堆棧的方式解決了這個問題。因為涉及到 v8 的實現,fibjs 目前沒有好的解決方案。針對這個問題,fibjs 實際上並不是完全的 fiber,等待時間較長的模塊,fibjs 仍然採取的是 callback 的設計。比如 web server 的處理 handler。這樣一來,fiber 的數量便不會因為連接的暴漲而增加太多。一個網站同時 1萬個連接,每秒請求可能只有 500,每個請求 100ms,同時處理的請求也才 50 個而已,而 fibjs 發起萬級 fiber 毫無壓力。這樣的數量級根本沒有到需要考慮內存的程度。
三、fibjs 仍比較年輕,沒有經過更多應用的檢驗,很多組件甚至在孢子社區內部也沒有實用過。以 ssl 為例,最近公司內部在應用的時候便發生了連接一些網站證書驗證問題。即便使用過的組件,也會存在設計不合理的問題。這些都是需要社區的支持,一起驗證、建議和改進的。
❹ nodejs調用webservice介面返回500是什麼原因
大於等於500的 HTTP 狀態碼表示伺服器遇到了問題。
你遇到的這個錯誤應該是請求有問題,無法被伺服器的程序處理,所以報錯了。
❺ 詳解nodejs中的process進程
雖然node對操作系統做了很多抽象的工作,但是你還是可以直接和他交互,比如和系統中已經存在的進程進行交互,創建工作子進程。node是一個用於事件循環的線程,但是你可以在這個事件循環之外創建其他的進程(線程)參與工作。
進程模塊
process模塊允許你獲得或者修改當前node進程的設置,不想其他的模塊,process是一個全局進程(node主進程),你可以直接通過process變數直接訪問它。
process實現了EventEmitter介面,exit方法會在當進程退出的時候執行。因為進程退出之後將不再執行事件循環,所有隻有那些沒有回調函數的代碼才會被執行。在下面例子中,setTimeout裡面的語句是沒有辦法執行到的。
process.on('exit', function () { setTimeout(function () { console.log('This will not run'); }, 100); console.log('Bye.');});
在你接觸node之後,你就會發現那些影響了主事件循環的異常會把整個node進程宕掉的。這會是相當嚴重的問題,所以process提供了另外一個有用的事件uncaughtException來解決這個問題,他會把異常抓取出來供你處理。
process.on('uncaughtException', function (err) { console.log('Caught exception: ' + err);});setTimeout(function () { console.log('This will still run.');}, 500);// Intentionally cause an exception, but don't catch it.nonexistentFunc();console.log('This will not run.');
我們來看上面的例子,我們注冊了uncaughtException事件來捕捉系統異常。執行到nonexistentFunc()時,因為該函數沒有定義所以會拋出異常。因為javascript是解釋性的語言,nonexistentFunc()方法上面的語句不會被影響到,他下面的語句不會被執行。所以他的執行結果如下:
Caught exception: ReferenceError: nonexistentFunc is not defined
This will still run.
我們再看一個例子。
var http = require('http');var server = http.createServer(function(req,res) { res.writeHead(200, {}); res.end('response'); badLoggingCall('sent response'); console.log('sent response');});process.on('uncaughtException', function(e) { console.log(e);});server.listen(8080);
在這里例子中我們創建了一個web伺服器,當處理完請求之後,我們會執行badLoggingCall()方法。因為這個方法不存在,所以會有異常拋出。但是我們注冊的uncaughtException事件會對異常做出處理,這樣伺服器不會受到影響得以繼續運行。我們會在伺服器端記錄錯誤日誌。
[ReferenceError: badLoggingCall is not defined]
與當前進程交互
node提供了一些process的屬性,如下:
process.version:包含當前node實例的版本號;
process.installPrefix:包含安裝路徑;
process.platform:列舉node運行的操作系統的環境,只會顯示內核相關的信息,如:linux2, darwin,而不是「Redhat ES3」 ,「Windows 7」,「OSX 10.7」等;
process.uptime():包含當前進程運行的時長(秒);
process.getgid(), process.setgid():獲取或者設置group id;
process.getuid(), process.setuid():獲取或者設計user id;
process.pid:獲取進程id;
process.title:設置進程名稱;
process.execPath:當前node進程的執行路徑,如:/usr/local/bin/node;
process.cwd():當前工作目錄;
process.memoryUsage():node進程內存的使用情況,rss代表ram的使用情況,vsize代表總內存的使用大小,包括ram和swap;
process.heapTotal,process.heapUsed:分別代表v8引擎內存分配和正在使用的大小。
事件循環和ticker
node中提供了process.nextTick()方法,允許你訪問事件循環和延時那你的工作。他有點類似於setTimeout(),他會在下次tick的時候執行,而且每隔一段事件就會執行一次。我們這里有個例子:
var http = require('http');var s = http.createServer(function(req, res) { res.writeHead(200, {}); res.end('foo'); console.log('http response'); process.nextTick(function(){console.log('tick')});});s.listen(8000);
當請求來的時候,會記錄日誌『http response'和『tick',當沒有請求的時候,每隔一段事件會執行事件循環,會輸出tick。
此外,nextTick創建的回調函數具有隔離性,他們之間不會相互影響。
process.on('uncaughtException', function(e) { console.log(e);});process.nextTick(function() { console.log('tick');});process.nextTick(function() { iAmAMistake(); console.log('tock');});process.nextTick(function() { console.log('tick tock');});console.log('End of 1st loop');
在這個例子中,首先輸出『End of 1st loop',然後順序的輸出nextTick的回調函數,第一個會正常輸出『tick',第二個是一個故意設置的異常會輸出異常信息,不會輸出『tock',因為nextTick回調函數的隔離性,第三個任然會輸出『tick tock'。結果如下:
End of 1st loop
tick
[ReferenceError: iAmAMistake is not defined]
tick tock
子進程
node提供了child_process模塊,允許你為主進程創建子進程,這樣你就可以使用更多的伺服器資源,使用更多的cpu,這些概念在前面的章節有介紹。node提供了child_process. spawn()和child_process. exec()為你實現這一功能,下面我們就單獨介紹。
child_process.exec( )
我們來看exec的一個簡單例子,他創建了一個子進程,第一個參數是一個shell命令,第二個參數是回調函數,處理返回結果。
var cp = require('child_process');cp.exec('ls -l', function(e, stdout, stderr) { if(!e) { console.log(stdout); console.log(stderr); }});
exec()還可以傳options的參數:
var options = { encoding: 'utf8', timeout: 0, maxBuffer: 200 * 1024, killSignal: 'SIGTERM', setsid: false, cwd: null, env: null };var cp = require('child_process');cp.exec('ls -l', options, function(e, stdout, stderr) { if(!e) { console.log(stdout); console.log(stderr); }});
encoding:I/O流的編碼格式;
timeout:進程超時時間;
killSignal:當時間或者緩沖區超限時終止進程的信號;
maxBuffer:stdout或stderr可增長的最大值;
setsid:決定在進程中是否創建一個新的會話;
cwd:進程的初始工作目錄,為null時表示使用node的當前工作目錄;
env:進程的環境變數。
child_process.spawn( )
child_process.spawn( )比child_process.exec( )更加強大和靈活,例子如下:var cp = require('child_process');var cat = cp.spawn('cat');cat.stdout.on('data', function(d) { console.log(d.toString());});cat.on('exit', function() { console.log('kthx');});cat.stdin.write('meow');cat.stdin.end();
❻ nodejs並發web框架
如何用用命令行開啟nodejs搭建web伺服器Node.js很方便,只需要訪問node.jsnode_moles只是放一些依賴包,具體資料庫文件當然是放在mysql目錄下了。要在不開編輯器前提下,使系統可訪問,你只要在控制台中定位到你系統的目錄後,使用node命令來啟動即可。
接下來,我們需要啟動我們的WebSocket服務。首先,我們需要構建自己的HTTP伺服器,在NodeJS中構建一個簡單的HTTP伺服器很簡單,soeasy。
答:您好,要寫一個登錄站點,使用Node.js編寫,最少200字最多500字,並且要回答完整,不要出現重復,回答您的問題。首先,您需要安裝Node.js,安裝完成後,您可以使用Node.js開發登錄站點。
幸運的是國內CNode社區的@fire9同學利用空餘時間搭建了一個鏡像的NPM資源庫,伺服器架設在日本,可以繞過某些不必要的網路問題。
為什麼前端要會使用Nodejs還有,作為fullstackengineering的一種,NodeJS只要求JS,所以使用Node可以讓專業的前端(除了前端專業性的基本功,至少還要了解演算法和數據結構等程序設計基礎的),能夠快速轉型成全棧開發。
nodejs是一個很強大的js運行環境,類似於jvm之於java。因此對js的支持非常好,催生了基於js的一系列應用開發。源於各js的應用的成長壯大,繼而催生出了npmNPM是基於nodejs環境的一個包管理器。
Node.js非阻塞模式的IO處理給Node.js帶來在相對低系統資源耗用下的高性能與出眾的負載能力,非常適合用作依賴其它IO資源的中間層服務。Node.js輕量高效,可以認為是數據密集型分布式部署環境下的實時應用系統的完美解決方案。
Node.js是一個基於ChromeV8引擎的JavaScript運行環境。Node.js使用了一個事件驅動、非阻塞式I/O的模型,使其輕量又高效。Node.js的包管理器npm,是全球最大的開源庫生態系統。
用node可以臨時搭建一個伺服器,還可以安裝所需要的依賴包。目前vue開發過程中,node是不可或缺的一個工具。當然也可以不用,但是不用的時候很少。
尋找開發者——首先JavaScript語言的普及度很高,一般公司都不乏Web前端工程師,而此類工程師的學習門檻也非常低。
如何一體化一個NodeJs的MVC開發框架1、項目文件夾主要是根據傳統的MVC設計模式,設計出來的框架。enterimagedescriptionhere入口文件介紹本框架的入口文件為index.js,該入口你可以添加多種全局靜態變數,例如你所需要的各個文件夾路徑,以及一些模塊。
2、「scripts」這里是一些nodejs的便捷命令,上線的時候會用到,直接在終端中,package.json同級目錄,執行『npmstart』即可啟動app.js。別的沒啥太大作用瞎寫即可。
3、因此目前在Node.js開發里,如果想做出自己想要的作品,框架是必然的選擇。如果是某些特定類型的應用,可以嘗試一些開源的程序,比如要用Nodejs做博客,有Hexo、Ghost等。
asusnodejswebframework是什麼
1、asus_framework是華碩框架服務的一個服務內容。asus_framework是為ASUSARMOURYCRATE奧創游戲智控中心服務的,它是華碩框架服務的一個服務內容。
2、MEAN指MongoDB+Express+Angular.js+Node.js,這一組合包括運行環境、資料庫、Web框架和前端引擎。被稱為全棧框架(Full-stackframework)。
3、Express是一個nodejs的web開源框架,用於快速的搭建web項目。其主要集成了web的http伺服器的創建、靜態文本管理、伺服器URL地址請求處理、get和post請求處理分發、session處理等功能。使用方法,在cmd中打開你所想創建web項目的路徑。
4、Node.js是一個基於ChromeV8引擎的JavaScript運行環境。Node.js使用了一個事件驅動、非阻塞式I/O的模型,使其輕量又高效。Node.js的包管理器npm,是全球最大的開源庫生態系統。
5、ASUSWebStorage是由華碩推出的網路硬碟服務,不但為你的電腦上的重要數據文件提供自動備份服務,也可以文件同步及文件共享(可設置密碼),功能比較豐富和實用。
如何搭建web前端框架1、對於vue的使用可以分為兩種使用形式:引入vue.js文件,在js中將vue實例化;通過node安裝第三方包--vue,搭建腳手架,用腳手架將頁面分成幾個組件編寫,從而利用組件來搭建頁面。
2、Web技術型這類框架把Web技術(JavaScript,CSS)帶到移動開發中,自研布局引擎處理CSS,使用JavaScript寫業務邏輯,使用流行的前端框架作為DSL,各端分別使用各自的原生組件渲染。
3、vue前端框架Vue(讀音/vju_/,類似於view)是一套用於構建用戶界面的漸進式框架。與其它大型框架不同的是,Vue被設計為可以自底向上逐層應用。Vue的核心庫只關注視圖層,不僅易於上手,還便於與第三方庫或既有項目整合。
4、常見的web前端開發框架如下:Bootstrap:主流框架之一,Bootstrap是基於HTML、CSS、JavaScript的,它簡潔靈活,使得Web開發更加快捷。html5-boilerplate:該框架可以快速構建健壯,且適應力強的webapp或網站。
5、一,socket通信說起web,肯定離不開tcp協議和http協議(https協議較為復雜,暫時不在本章討論范圍之內)。
如何用nodejs搭建web伺服器web的話就必須搭建相應的環境,比如你製作的網站是asp環境就必須搭建asp環境的,還有php,jps等等,根據自己的需求安裝環境,還有其他的web應用。
打開Dreamweaver,按照圖中標示出來的地方點擊,打開站點管理界面。如果原來沒有站點,這里會直接顯示管理站點,直接點擊就行。
靜態資源在node.js里的意思是不變的,如圖片、前端js、css、html頁面等。
首先,您需要安裝Node.js,安裝完成後,您可以使用Node.js開發登錄站點。其次,您需要編寫登錄站點的前端代碼,包括HTML、CSS和JavaScript,以及一些框架,如jQuery等,來實現登錄站點的功能。
你可以用node建一個unixdomainsocketserver,讓php連接到那兒,然後把需要的參數傳過去,讓這個node的server處理完再回復給php,php負責把結果顯示出來就行了。
用websocket+nodejs實現web即時通信服務端,Socketio和nodejs配的不錯,建立了socket就可以listen和broadcast。
❼ nodejs當web伺服器行不行
可以呀
使用Node.js搭建Web伺服器是學習Node.js比較全面的入門教程,因為實現Web伺服器需要用到幾個比較重要的模塊:http模塊、文件系統、url解析模塊、路徑解析模塊、以及301重定向技術等,下面我們就一起來學習如何搭建一個簡單的Web伺服器。
作為一個Web伺服器應具備以下幾個功能:
1、能顯示以.html/.htm結尾的Web頁面
2、能直接打開以.js/.css/.json/.text結尾的文件內容
3、顯示圖片資源
4、自動下載以.apk/.docx/.zip結尾的文件
5、形如http://xxx.com/a/b/ , 則查找b目錄下是否有index.html,如果有就顯示,如果沒有就列出該目錄下的所有文件及文件夾,並可以進一步訪問。
6、形如http://xxx.com/a/b, 則作301重定向到http://xxx.com/a/b/ , 這樣可以解決內部資源引用錯位的問題。
引入需要用到的幾個模塊:
創建服務並在指定的埠監聽:
在創建服務的時候需要傳遞一個匿名函數processRequest 對請求進行處理,processRequest接收2個參數,分別是request和response, request對象中包含了請求的所有內容,response是用來設置響應頭以及對客戶端做出響應操作。
processRequest:function(request,response){varhasExt =true;varrequestUrl = request.url;varpathName = url.parse(requestUrl).pathname;//對請求的路徑進行解碼,防止中文亂碼pathName = decodeURI(pathName);//如果路徑中沒有擴展名if(path.extname(pathName) ===''){//如果不是以/結尾的,加/並作301重定向if(pathName.charAt(pathName.length-1) !="/"){pathName +="/";varredirect ="http://"+request.headers.host + pathName;response.writeHead(301, {location:redirect});response.end();return;}//添加默認的訪問頁面,但這個頁面不一定存在,後面會處理pathName +="index.html";hasExt =false;//標記默認頁面是程序自動添加的}//獲取資源文件的相對路徑varfilePath = path.join("http/webroot",pathName);//獲取對應文件的文檔類型varcontentType =this.getContentType(filePath);//如果文件名存在fs.exists(filePath,function(exists){if(exists){response.writeHead(200, {"content-type":contentType});varstream = fs.createReadStream(filePath,{flags:"r",encoding:null});stream.on("error", function() {response.writeHead(500,{"content-type":"text/html"});response.end("<h1>500 Server Error</h1>");});//返迴文件內容stream.pipe(response);}else{//文件名不存在的情況if(hasExt){//如果這個文件不是程序自動添加的,直接返回404response.writeHead(404, {"content-type":"text/html"});response.end("<h1>404 Not Found</h1>");}else{//如果文件是程序自動添加的且不存在,則表示用戶希望訪問的是該目錄下的文件列表varhtml ="<head><meta charset='utf-8'></head>";try{//用戶訪問目錄varfiledir = filePath.substring(0,filePath.lastIndexOf('\'));//獲取用戶訪問路徑下的文件列表varfiles = fs.readdirSync(filedir);//將訪問路徑下的所以文件一一列舉出來,並添加超鏈接,以便用戶進一步訪問for(variinfiles){varfilename = files[i];html +="<div><a href='"+filename+"'>"+filename+"</a></div>";}}catch(e){html +="<h1>您訪問的目錄不存在</h1>"}response.writeHead(200, {"content-type":"text/html"});response.end(html);}}});}請求處理函數中有幾個重點需要說一下:
對於路徑中有中文的,瀏覽器會自動進行編碼(英文不變,中文會變),因此在接收到地址後,需要對地址進行解碼,否則最後得到的路徑和真實路徑不相符,
當訪問路徑不是以具體的文件結尾,並且不是以/結尾,則需要通過重定向加上/,表示當前目錄,否則當前路徑下的靜態資源會找不到
如果訪問路徑是目錄,則列出該目錄下所有文件及文件夾,並可以點擊訪問,為了讓中文目錄能正常顯示,則還要在header中設置charset=utf-8
核心代碼就這么多,大概140行左右,完整的代碼已上傳到github:https://github.com/git-onepixel/Node,
如果要運行demo,打開cmd切換到根目錄,運行node start 即可。