導航:首頁 > IDC知識 > node伺服器

node伺服器

發布時間:2020-08-04 15:07:03

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/ , 這樣可以解決內部資源引用錯位的問題。

引入需要用到的幾個模塊:


//http協議模塊var http = require('http');//url解析模塊var url = require('url');//文件系統模塊var fs = require("fs");//路徑解析模塊var path = require("path");

創建服務並在指定的埠監聽:


//創建一個服務var httpServer = http.createServer(this.processRequest.bind(this)); //在指定的埠監聽服務httpServer.listen(port,function(){    console.log("[HttpServer][Start]","runing at http://"+ip+":"+port+"/");    console.timeEnd("[HttpServer][Start]");});

在創建服務的時候需要傳遞一個匿名函數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#這種靜態語言相比,就像個小玩具。
光一個動態語言特性,就決定了它不適合寫大的邏輯。寫個三五百行的小東西可以,想用它寫個幾萬行的項目,就屬於自己為難自己了。

與node伺服器相關的知識