使用Node.js搭建Web服務(wù)器
1、 Node.js 創(chuàng)建的第一個應(yīng)用
1、引入http模塊
var http = require("http");2、 創(chuàng)建服務(wù)器
接下來我們使用 http.createServer() 方法創(chuàng)建服務(wù)器,并使用 listen 方法綁定 8888 端口。函數(shù)通過 request, response 參數(shù)來接收和響應(yīng)數(shù)據(jù)。
//1.引入 http 模塊
var http=require('http');
//2.用 http 模塊創(chuàng)建服務(wù)
http.createServer(function(req,res){
// 發(fā)送 HTTP 頭部
// HTTP 狀態(tài)值: 200 : OK
//設(shè)置 HTTP 頭部,狀態(tài)碼是 200,文件類型是 html,字符集是 utf-8
res.writeHead(200,{"Content-Type":"text/html;charset='utf-8'"});
res.write('你好 nodejs');
res.write('我是第一個 nodejs 程序');
res.end(); /*結(jié)束響應(yīng)*/
}).listen(8001);2、 WEB 服務(wù)器介紹
Web 服務(wù)器一般指網(wǎng)站服務(wù)器,是指駐留于因特網(wǎng)上某種類型計(jì)算機(jī)的程序,可以向?yàn)g覽器等 Web 客戶端提供文檔, 也可以放置網(wǎng)站文件,讓全世界瀏覽;可以放置數(shù)據(jù)文件,讓全世界下載。目前最主流的三個 Web 服務(wù)器是 Apache 、 Nginx 、IIS。
3、 Nodejs 封裝一個 WEB 服務(wù)器
啟動
node start
功能
* 能顯示以 `.html/.htm` 結(jié)尾的 Web 頁面
* 能直接打開以 `.js/.css/.json/.text` 結(jié)尾的文件內(nèi)容
* 顯示圖片資源
* 自動下載以 `.apk/.docx/.zip` 結(jié)尾的文件
* 形如 `http://xxx.com/a/b/` , 則查找b目錄下是否有 `index.html`,如果有就顯示,如果沒有就列出該目錄下的所有文件及文件夾,并可以進(jìn)一步訪問。
* 形如 `http://xxx.com/a/b`, 則作301重定向到 `http://xxx.com/a/b/` , 這樣可以解決內(nèi)部資源引用錯位的問題。
HttpServer.js
module.exports = (function () {
"use strict";
console.time('[HttpServer][Start]');
//http協(xié)議模塊
var http = require('http');
//url解析模塊
var url = require('url');
//文件系統(tǒng)模塊
var fs = require("fs");
//路徑解析模塊
var path = require("path");
return {
//啟動服務(wù)
start: function () {
var port = this.config.port;
var ip = this.config.ip;
//創(chuàng)建一個服務(wù)
var httpServer = http.createServer(this.processRequest.bind(this));
//在指定的端口監(jiān)聽服務(wù)
httpServer.listen(port, function () {
console.log("[HttpServer][Start]", "runing at http://" + ip + ":" + port + "/");
console.timeEnd("[HttpServer][Start]");
});
httpServer.on("error", function (error) {
console.error(error);
});
},
/**
* 請求處理
* @param request
* @param response
*/
processRequest: function (request, response) {
var hasExt = true;
var requestUrl = request.url;
var pathName = url.parse(requestUrl).pathname;
//對請求的路徑進(jìn)行解碼,防止中文亂碼
pathName = decodeURI(pathName);
//如果路徑中沒有擴(kuò)展名
if ((pathName) === '') {
//如果不是以/結(jié)尾的,加/并作301重定向
if (pathName.charAt(pathName.length - 1) != "/") {
pathName += "/";
var redirect = "http://" + request.headers.host + pathName;
response.writeHead(301, {
location: redirect
});
response.end();
return; //fix bug: 執(zhí)行301重定向后應(yīng)終止后續(xù)流程,以防 "write after end" 異常
}
//添加默認(rèn)的訪問頁面,但這個頁面不一定存在,后面會處理
pathName += "index.html";
hasExt = false; //標(biāo)記默認(rèn)頁面是程序自動添加的
}
//獲取資源文件的相對路徑
var filePath = path.join("http/webroot", pathName);
//獲取對應(yīng)文件的文檔類型
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>");
});
//返回文件內(nèi)容
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);
//將訪問路徑下的所以文件一一列舉出來,并添加超鏈接,以便用戶進(jìn)一步訪問
for (var i in files) {
var filename = 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);
}
}
});
},
/**
* 獲取文檔的內(nèi)容類型
* @param filePath
* @returns {*}
*/
getContentType: function (filePath) {
var contentType = this.config.mime;
var ext = path.extname(filePath).substr(1);
if (contentType.hasOwnProperty(ext)) {
return contentType[ext];
} else {
return contentType.default;
}
},
///配置信息
config: {
port: 8888,
ip: '127.0.0.1',
mime: {
html: "text/html",
js: "text/javascript",
css: "text/css",
gif: "image/gif",
jpg: "image/jpeg",
png: "image/png",
ico: "image/icon",
txt: "text/plain",
json: "application/json",
default: "application/octet-stream"
}
}
}
})();start.js
var http = require('./http/HttpServer');
http.start();源代碼
到此這篇關(guān)于使用Node.js搭建Web服務(wù)器的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Node.js入門教程:在windows和Linux上安裝配置Node.js圖文教程
這篇文章主要介紹了Node.js入門教程:在windows和Linux上安裝配置Node.js的方法,本文圖文并茂,步驟明細(xì),是學(xué)習(xí)安裝node.js的絕佳教程,需要的朋友可以參考下2014-08-08
nvm報錯Now?using?node?v版本號(64-bit)圖文解決方法
這篇文章主要給大家介紹了關(guān)于nvm報錯Now?using?node?v版本號(64-bit)的解決方法,文中將解決的辦法介紹的非常詳細(xì),對遇到這個問題的朋友具有一定的參考借鑒價值,需要的朋友可以參考下2023-11-11
node.js中fs.stat與fs.fstat的區(qū)別詳解
fs.stat和fs.fstat他們都是用來獲取文件的狀態(tài)信息,下面這篇文章主要給大家介紹了關(guān)于node.js中fs.stat與fs.fstat區(qū)別的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-06-06
node 利用進(jìn)程通信實(shí)現(xiàn)Cluster共享內(nèi)存
本篇文章主要介紹了node 利用進(jìn)程通信實(shí)現(xiàn)Cluster共享內(nèi)存,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
Node.js Buffer模塊功能及常用方法實(shí)例分析
這篇文章主要介紹了Node.js Buffer模塊功能及常用方法,結(jié)合實(shí)例形式分析了Buffer模塊的各種常用函數(shù)及相關(guān)使用技巧,需要的朋友可以參考下2019-01-01
Node.js中的require.resolve方法使用簡介
在Node.js中,可以使用require.resolve函數(shù)來查詢某個模塊文件的帶有完整絕對路徑的文件名,下面這篇文章主要介紹了Node.js中require.resolve方法使用的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-04-04
詳解node.js搭建代理服務(wù)器請求數(shù)據(jù)
本篇文章主要介紹了詳解node.js搭建代理服務(wù)器請求數(shù)據(jù),具有一定的參考價值,有興趣的可以了解一下。2017-04-04
nodejs遍歷文件夾下并操作HTML/CSS/JS/PNG/JPG的方法
這篇文章主要介紹了nodejs遍歷文件夾下并操作HTML/CSS/JS/PNG/JPG的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11
Node.js應(yīng)用設(shè)置安全的沙箱環(huán)境
這篇文章主要介紹了Node.js應(yīng)用設(shè)置安全的沙箱環(huán)境的方法以及注意事項(xiàng),對此有需要的朋友可以參考學(xué)習(xí)下。2018-04-04

