1、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){ var hasExt = true; var requestUrl = request.url; var pathName = url.parse(requestUrl).pathname; //對請求的路徑進行解碼,防止中文亂碼 pathName = decodeURI(pathName); //如果路徑中沒有擴展名 if(path.extname(pathName) === ''){ //如果不是以/結尾的,加/並作301重定向 if (pathName.charAt(pathName.length-1) != "/"){ pathName += "/"; var redirect = "http://"+request.headers.host + pathName; response.writeHead(301, { location:redirect }); response.end(); return ; } //添加默認的訪問頁面,但這個頁面不一定存在,後面會處理 pathName += "index.html"; hasExt = false; //標記默認頁面是程序自動添加的 } //獲取資源文件的相對路徑 var filePath = path.join("http/webroot",pathName); //獲取對應文件的文檔類型 var contentType = this.getContentType(filePath); //如果文件名存在 fs.exists(filePath,function(exists){ if(exists){ response.writeHead(200, {"content-type":contentType}); var stream = 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){ //如果這個文件不是程序自動添加的,直接返回404 response.writeHead(404, {"content-type": "text/html"}); response.end("<h1>404 Not Found</h1>"); }else { //如果文件是程序自動添加的且不存在,則表示用戶希望訪問的是該目錄下的文件列表 var html = "<head><meta charset='utf-8'></head>"; try{ //用戶訪問目錄 var filedir = filePath.substring(0,filePath.lastIndexOf('\')); //獲取用戶訪問路徑下的文件列表 var files = fs.readdirSync(filedir); //將訪問路徑下的所以文件一一列舉出來,並添加超鏈接,以便用戶進一步訪問 for(var i in files){ var filename = files[i]; html += "<div><ahref='"+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 即可。
2、怎麼訪問伺服器上的node?
首先創建一個HTTP伺服器,當伺服器接收到客戶端的請求後,向""網站請求數據,當從該網站接受到的響應數據後,將響應數據發送給客戶端.
代碼如下:
var http=require("http");
var url=require("url");
var server=http.createServer(function(sreq,sres){
var url_parts=url.parse(sreq.url);
var opts={
host:"",
port:80,
path:url_parts.pathname,
headers:sreq.headers
};
var creq=http.get(opts, function (cres) {
sres.writeHead(cres.statusCode,cres.headers);
cres.pipe(sres);
});
sreq.pipe(creq);
});
server.listen(1337,"127.0.0.1", function () {
console.log("開始監聽"+server.address().port+"......");
});
運行代碼後,在瀏覽器端運行程序:
發現沒有,界面是淘寶的官網,但是地址確實變成我們本地的了.
是不是很好玩的樣子呢,其實node.js可以做很多的事情,小夥伴們自己去開發吧。
3、node 怎麼在伺服器上運行?
首先安裝node.js環境,windows可以直接下載安裝包,下一步到底就可以了~~linux可以使用不同發行版的包管理版器(但通常版權本都不是最新的),使用最新版本可以從官網下載壓縮包,然後解壓就可以了,運行node.js代碼只需要在命令行中運行node XXX.js(xxx.js為你的代碼文件,如果沒有將node添加到環境變數,則需要進入node的目錄在執行上述命令)~ok 貌似就是這樣了~
4、nodejs 如何部署到伺服器上?
兩點:第一是否是線上服務,第二是否需要守護進程;
第一點,如果是線上服務,毫無疑問需要一個守護進程來保證,發生意外導致進程退出後,能重新啟動,提供服務;當然就需要pm2等守護進程來啟動,使用方法請自行參照github;第二點,是否需要守護進程,如果不需要,那麼直接node啟動即可;如果需要,也不必擔心pm2啟動進程後並不會搶占伺服器資源,如果你的server有很大的需求,毋庸置疑需要更多的內存和cpu,如果沒有很大需求,pm2會基於linux的資源調度策略,並不會搶占;
5、在區域網中怎麼搭建node伺服器?
1.安裝nodejs服務(從官網下載安裝),node相當於apache伺服器
2.在自己定義的目錄下新建伺服器文件如 server.js
例如,我在E:\PhpProject\html5\websocket下創建了server.js文件
var http = require('http');//引入http模塊
//開啟服務,監聽8888埠
//埠號最好為6000以上
var server = http.createServer(function(req,res){
console.log('有客戶端連接');//創建連接成功顯示在後台
6、node.js代碼怎麼放到伺服器
將代碼部署到伺服器的代碼目錄,這里要注意,如果直接 npm start 或 node app.js 啟動,則一旦退出 ssh 遠程登陸,nodeapp 就會停止運行。因此我們使用 forever 或者pm2啟動 nodeapp。
forever和pm2的區別:
forever
管理多個站點,每個站訪問量不大,不需要監控。
pm2
網站訪問量比較大,需要完整的監控界面。
使用forever的命令:
[plain] view plain copy
npm install forever -g
[plain] view plain copy
forever start app.js
7、node怎麼創建伺服器
小鳥雲伺服器niaoyun實例創建好之後,您可以使用以下任意一種方式登錄伺服器:
遠程桌面連接(,MSTSC):採用這種方式登錄,請確保實例能訪問公網。如果在創建實例時沒有購買帶寬,則不能使用遠程桌面連接。
管理終端VNC:無論您在創建實例時是否購買了帶寬,只要您本地有網頁瀏覽器,都可以通過管理控制台的管理終端登錄實例。
使用遠程桌面連接(MSTSC)登錄實例
打開開始菜單>遠程桌面連接,或在開始菜單>搜索中輸入mstsc。也可以使用快捷鍵Win+R來啟動運行窗口,輸入mstsc後回車啟動遠程桌面連接。
在遠程桌面連接對話框中,輸入實例的公網IP地址。單擊顯示選項。
輸入用戶名,如小鳥雲默認為niaoyun。單擊允許我保存憑據,然後單擊連接。這樣以後登錄就不需要手動輸入密碼了。
8、nodejs寫伺服器怎麼樣
目前最主流的三個Web伺服器是Apache、Nginx、IIS。
Node.js 提供了 http 模塊,http 模塊主要用於搭建 HTTP 服務端和客戶端,使用 HTTP 伺服器或客戶端功能必須調用 http 模塊,代碼如下:
[javascript] view plain copy
var http = require('http');
在通常的伺服器中,數據流通的方式是客戶先通過瀏覽器進行發送請求,伺服器在項目中進行查找,然後進客戶所需要的頁面進行返回,在查找的過程中可能存在兩種情況,就是存在和不存在,當然,我們會做出判斷,下面就是簡單的伺服器實現過程:
1、編寫伺服器代碼server.js
[javascript] view plain copy
var http=require('http');
var fs = require('fs');
var url = require('url');
//創建伺服器
http.createServer(function(request,response) {
//解析請求,包括文件名
var pathname= url.parse(request.url).pathname;
//輸出請求的文件名
console.log("Request for "+ pathname + " received.");
//從文件系統中都去請求的文件內容
fs.readFile(pathname.substr(1),function(err, data) {
if(err) {
console.log(err);
//HTTP 狀態碼 404 : NOT FOUND
//Content Type:text/plain
response.writeHead(404,{'Content-Type': 'text/html'});
}
else {
//HTTP 狀態碼 200 : OK
//Content Type:text/plain
response.writeHead(200,{'Content-Type': 'text/html'});
//寫會相應內容
response.write(data.toString());
}
//發送響應數據
response.end();
});
}).listen(8081);
console.log('Server running at http://127.0.0.1:8081/');
通過上面代碼,我們就能夠實現伺服器對於文件的查找,下面,我們就進行創建一個html文件,然後通過瀏覽器進行訪問
2、編寫html文件(index.html),用於瀏覽器進行請求
[html] view plain copy
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
這是一個用於進行nodejs伺服器測試的html文件,我們能夠通過在瀏覽器上面輸入
http://127.0.0.1:8081/WebServer/index.html進行訪問
</body>
</html>
創建完之後,我們進行測試,現在我的目錄結構是這樣的:
3、進行測試
(1) 首先我們啟動伺服器,使用命令node WebServer/server.js
(2) 在瀏覽器進行訪問,在url欄中輸入http://127.0.0.1:8081/WebServer/index.html
其顯示效果如下所示:
後台效果如下所示:
當然,我們也能夠通過訪問通過http://127.0.0.1:8081/LoveYou.html訪問server.js文件夾外邊的文件,進行到這里,我們就可以得到文件返回給前端,但是有些同學可能會問,樣式該怎麼做??如下面代碼,我們進行了樣式的定義,修改了兩個div的大小,並且給div設置邊框
[html] view plain copy
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
<style>
body {
border: 1px solid red;
}
div {
border-radius: 10px;
width: 500px;
height: 200px;
border: 2px solid green;
}
</style>
</head>
<body>
這是一個用於進行nodejs伺服器測試的html文件,我們能夠通過在瀏覽器上面輸入
http://127.0.0.1:8081/WebServer/index.html進行訪問
<div>1</div>
<div>2</div>
</body>
</html>
效果如下所示,
有了這些,我們還會問,你這樣直接將樣式寫在html中,我可不幹,我要把樣式寫道另外單獨一個文件中,然後通過引用的方式引入,於是就會有人使用下面代碼:
[html] view plain copy
<link rel="stylesheet" href="http://127.0.0.1:8081/WebServer/index.css">
然而,這段代碼並不會起作用,因為傳遞給前端的方式Content-Type是有問題的,需要我們的伺服器進行下一步操作,也就是處理靜態文件。既然傳給前端時需要告訴type是css,那麼我們就進行區分對待,如下面代碼,我們對server.js進行修改如下:
[html] view plain copy
var http=require('http');
var fs = require('fs');
var url = require('url');
//創建伺服器
http.createServer(function(request,response) {
//解析請求,包括文件名
var pathname= url.parse(request.url).pathname;
//輸出請求的文件名
console.log("Request for "+ pathname + " received.");
//當請求static文件夾時,設置文件返回類型是text/css
var firstDir = pathname && pathname.split('/')[2];
var ContentType = null;
if (firstDir && firstDir === 'static') {
ContentType = {'Content-Type': 'text/css'};
} else {
ContentType = {'Content-Type': 'text/html'}
}
//從文件系統中去請求的文件內容
fs.readFile(pathname.substr(1),function(err, data) {
if(err) {
console.log(err);
//HTTP 狀態碼 404 : NOT FOUND
//Content Type:text/plain
response.writeHead(404, {'Content-Type': 'text/html'});
}
else {
//HTTP 狀態碼 200 : OK
//Content Type:text/plain
response.writeHead(200, ContentType);
//寫會回相應內容
response.write(data.toString());
}
//發送響應數據
response.end();
});
}).listen(8081);
console.log('Server running at http://127.0.0.1:8081/');
接著,我們需要在項目中創建一個static文件夾,如下面所示結構:
在static文件夾中創建index.css文件,代碼內容如下所示:
[html] view plain copy
body {
border: 1px solid blue;
}
div {
border-radius: 10px;
width: 400px;
height: 200px;
border: 2px solid yellow;
}
也就是修改body邊框為藍色,div邊框為黃色,同時我們需要更新index.html中文件內容如下所示:
[html] view plain copy
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
<link rel="stylesheet" href="http://127.0.0.1:8081/WebServer/static/index.css">
</head>
<body>
這是一個用於進行nodejs伺服器測試的html文件,我們能夠通過在瀏覽器上面輸入
http://127.0.0.1:8081/WebServer/index.html進行訪問
<div>1</div>
<div>2</div>
</body>
</html>
也就是通過引入的方式將樣式引入到html文件中,然後在瀏覽器查看內容,效果如下所示:
很明顯,我們的樣式已經通過引入的方式引進到html頁面中了,同樣的原理,我們能夠進行將js也通過引入的方式進行使用,在這里我就不一一貼出代碼了,看看效果如下所示:
9、nodejs 靜態伺服器和http伺服器有什麼區別
參考cnodejs.org上面的靜態伺服器例子,寫了下面的一個nodejs靜態伺服器例子,裡麵包含cache,壓縮,貼代碼如下
/**
* 靜態文件伺服器測試例子
* User: xuwm
* Date: 13-5-17
* Time: 上午8:38
* To change this template use File | Settings | File Templates.
*/
var port=3333;
var http = require("http");
var url = require("url");
var fs = require("fs");
var path = require("path");
var mime = require("./mime").types;
var config = require("./config");
var zlib = require("zlib");
//創建http服務端
var server=http.createServer(function(request,response){
var obj= url.parse(request.url);
response.setHeader("Server","Node/V8");
console.log(obj);
var pathname=obj.pathname;
if(pathname.slice(-1)==="/"){
pathname=pathname+config.Welcome.file; //默認取當前默認下的index.html
}
var realPath = path.join("assets", path.normalize(pathname.replace(/\.\./g, "")));
console.log(realPath) ;
var pathHandle=function(realPath){
//用fs.stat方法獲取文件
fs.stat(realPath,function(err,stats){
if(err){
response.writeHead(404,"not found",{'Content-Type':'text/plain'});
response.write("the request "+realPath+" is not found");
response.end();
}else{
if(stats.isDirectory()){
}else{
var ext = path.extname(realPath);
ext = ext ? ext.slice(1) : 'unknown';
var contentType = mime[ext] || "text/plain";
response.setHeader("Content-Type", contentType);
var lastModified = stats.mtime.toUTCString();
var ifModifiedSince = "If-Modified-Since".toLowerCase();
response.setHeader("Last-Modified", lastModified);
if (ext.match(config.Expires.fileMatch)) {
var expires = new Date();
expires.setTime(expires.getTime() + config.Expires.maxAge * 1000);
response.setHeader("Expires", expires.toUTCString());
response.setHeader("Cache-Control", "max-age=" + config.Expires.maxAge);
}
if (request.headers[ifModifiedSince] && lastModified == request.headers[ifModifiedSince]) {
console.log("從瀏覽器cache里取")
response.writeHead(304, "Not Modified");
response.end();
} else {
var raw = fs.createReadStream(realPath);
var acceptEncoding = request.headers['accept-encoding'] || "";
var matched = ext.match(config.Compress.match);
if (matched && acceptEncoding.match(/\bgzip\b/)) {
response.writeHead(200, "Ok", {'Content-Encoding': 'gzip'});
raw.pipe(zlib.createGzip()).pipe(response);
} else if (matched && acceptEncoding.match(/\bdeflate\b/)) {
response.writeHead(200, "Ok", {'Content-Encoding': 'deflate'});
raw.pipe(zlib.createDeflate()).pipe(response);
} else {
response.writeHead(200, "Ok");
raw.pipe(response);
}
}
}
}
});
}
pathHandle(realPath);
});
server.listen(port);
console.log("http server run in port:"+port);
首先需要在JS文件里創建一個assets的文件夾,裡面放入你要瀏覽的靜態文件,比如,index.html,demo.js等。
運行方式為:在命令行里切換到上面的JS的文件目錄,然後輸入 node JS文件名
10、node.js和java哪個做伺服器好
沒可比性。。。
一個是強類型靜態,一個是弱類型動態
Node跟PHP,Ruby,Python這種動態語言比一比還可以。。。。。和JAVA,C#這種靜態語言相比,就像個小玩具。
光一個動態語言特性,就決定了它不適合寫大的邏輯。寫個三五百行的小東西可以,想用它寫個幾萬行的項目,就屬於自己為難自己了。