janneyabc 发表于 2017-2-23 07:22:00

写一个 nodejs npm应用

前言、没图不说话,先上图。







  What's webhere?
  有没有遇到这样的场景:写程序的时候,需要访问一个文件,这个文件 需要是放到一台web服务器上,但是你不是开发的web应用。
  所以呢,你不得不去找一个web服务器,把你的文件上传上去,或者干脆直接创建一个web应用程序...
  webhere就是来解决这个问题,在你想要当做web根目录的目录下,打开你亲爱的命令行,敲下webhere,回车,搞定。
  然后就可以通过web浏览器访问目录下的文件了。

安装:$ npm install webhere -g
运行:$ webhere



一、 原理


  原理比较简单,一句话来说,就是搭建一个web服务器。
  1.用nodejs的http包创建一个web服务。
  2.对访问路径路由到具体的文件路径。
  3.根据文件是否存在写具体的响应码,根据文件的后缀写具体Content-type。
  4.返回文件的内容,响应结束。



二、 实现


  1.创建nodejs的pakage.json,添加应用的bin的信息和其他描述信息。



{
"name": "webhere",
"version": "0.0.7",
"description": "Create a web server in the current directory.",
"repository": {
"type": "git",
"url": "git@github.com:smallyard/webhere.git"
},
"author": "liuhongqiang <liuhongqiang@live.cn>",
"license": "MIT",
"bin": {
"webhere": "./bin/webhere"
},
"keywords": [
"webhere",
"server",
"web server"
],
"engines": {
"node": ">= 0.10"
},
"readmeFilename": "README.md"
}
  2.bin文件,程序的入口。



#!/usr/bin/env node
var server = require("../src/server");
server.start();

  3.web服务,server.js



var http = require("http");
var router = require("./router");
var render = require("./render");
function start() {
function onRequest(request, response) {
var routeResult = router.route(request.url);
var responseInfo = render.getResponseInfo(routeResult);
response.writeHead(responseInfo.status, {"Content-Type": responseInfo.contentType});
response.write(responseInfo.content);
response.end();
}
http.createServer(onRequest).listen(9000);
console.log("Server has started.");
console.log("Server address: http://127.0.0.1:9000");
}
exports.start = start;
  4.路由router.js



var fs = require("fs");
function route(path) {
console.log("Origin path: " + path);
if (path == "/") {
return "htmlIndex";
} else {
path = "." + path;
if (fs.existsSync(path) && fs.statSync(path).isFile()) {
return path;
} else {
return "html404";
}
}
}
exports.route = route;
  5.内容渲染,render.js



var fs = require("fs");
var contentTypes = require("./contentTypes");
var HTML_INDEX = require("./html/index").html;
var HTML_404 = require("./html/404").html;
function getResponseInfo(routeResult) {
console.log("Result path: " + routeResult);
var status = 200;
var content = "";
var contentType = "text/html";
if (routeResult == "htmlIndex") {
content = HTML_INDEX;
} else if (routeResult == "html404") {
status = 404;
content = HTML_404;
} else {
content = fs.readFileSync(routeResult);
contentType = getContentType(routeResult);
}
return {
"status": status,
"contentType": contentType,
"content": content
};
}
function getContentType(filePath) {
var suffix = "";
var pointIndex = filePath.lastIndexOf(".");
if (pointIndex != -1) {
suffix = filePath.substr(pointIndex);
}
if (contentTypes.hasOwnProperty(suffix)) {
return contentTypes;
} else {
return contentTypes[".*"];
}
}
exports.getResponseInfo = getResponseInfo;
  最后,附上我从开源中国上抓取的content-type



{
".*": "application/octet-stream",
".tif": "application/x-tif",
".001": "application/x-001",
".301": "application/x-301",
".323": "text/h323",
".906": "application/x-906",
".907": "drawing/907",
".a11": "application/x-a11",
".acp": "audio/x-mei-aac",
".ai": "application/postscript",
".aif": "audio/aiff",
".aifc": "audio/aiff",
".aiff": "audio/aiff",
".anv": "application/x-anv",
".asa": "text/asa",
".asf": "video/x-ms-asf",
".asp": "text/asp",
".asx": "video/x-ms-asf",
".au": "audio/basic",
".avi": "video/avi",
".awf": "application/vnd.adobe.workflow",
".biz": "text/xml",
".bmp": "application/x-bmp",
".bot": "application/x-bot",
".c4t": "application/x-c4t",
".c90": "application/x-c90",
".cal": "application/x-cals",
".cat": "application/vnd.ms-pki.seccat",
".cdf": "application/x-netcdf",
".cdr": "application/x-cdr",
".cel": "application/x-cel",
".cer": "application/x-x509-ca-cert",
".cg4": "application/x-g4",
".cgm": "application/x-cgm",
".cit": "application/x-cit",
".class": "java/*",
".cml": "text/xml",
".cmp": "application/x-cmp",
".cmx": "application/x-cmx",
".cot": "application/x-cot",
".crl": "application/pkix-crl",
".crt": "application/x-x509-ca-cert",
".csi": "application/x-csi",
".css": "text/css",
".cut": "application/x-cut",
".dbf": "application/x-dbf",
".dbm": "application/x-dbm",
".dbx": "application/x-dbx",
".dcd": "text/xml",
".dcx": "application/x-dcx",
".der": "application/x-x509-ca-cert",
".dgn": "application/x-dgn",
".dib": "application/x-dib",
".dll": "application/x-msdownload",
".doc": "application/msword",
".dot": "application/msword",
".drw": "application/x-drw",
".dtd": "text/xml",
".dwf": "application/x-dwf",
".dwg": "application/x-dwg",
".dxb": "application/x-dxb",
".dxf": "application/x-dxf",
".edn": "application/vnd.adobe.edn",
".emf": "application/x-emf",
".eml": "message/rfc822",
".ent": "text/xml",
".epi": "application/x-epi",
".eps": "application/postscript",
".etd": "application/x-ebx",
".exe": "application/x-msdownload",
".fax": "image/fax",
".fdf": "application/vnd.fdf",
".fif": "application/fractals",
".fo": "text/xml",
".frm": "application/x-frm",
".g4": "application/x-g4",
".gbr": "application/x-gbr",
".": "application/x-",
".gif": "image/gif",
".gl2": "application/x-gl2",
".gp4": "application/x-gp4",
".hgl": "application/x-hgl",
".hmr": "application/x-hmr",
".hpg": "application/x-hpgl",
".hpl": "application/x-hpl",
".hqx": "application/mac-binhex40",
".hrf": "application/x-hrf",
".hta": "application/hta",
".htc": "text/x-component",
".htm": "text/html",
".html": "text/html",
".htt": "text/webviewhtml",
".htx": "text/html",
".icb": "application/x-icb",
".ico": "application/x-ico",
".iff": "application/x-iff",
".ig4": "application/x-g4",
".igs": "application/x-igs",
".iii": "application/x-iphone",
".img": "application/x-img",
".ins": "application/x-internet-signup",
".isp": "application/x-internet-signup",
".IVF": "video/x-ivf",
".java": "java/*",
".jfif": "image/jpeg",
".jpe": "application/x-jpe",
".jpeg": "image/jpeg",
".jpg": "application/x-jpg",
".js": "application/x-javascript",
".jsp": "text/html",
".la1": "audio/x-liquid-file",
".lar": "application/x-laplayer-reg",
".latex": "application/x-latex",
".lavs": "audio/x-liquid-secure",
".lbm": "application/x-lbm",
".lmsff": "audio/x-la-lms",
".ls": "application/x-javascript",
".ltr": "application/x-ltr",
".m1v": "video/x-mpeg",
".m2v": "video/x-mpeg",
".m3u": "audio/mpegurl",
".m4e": "video/mpeg4",
".mac": "application/x-mac",
".man": "application/x-troff-man",
".math": "text/xml",
".mdb": "application/x-mdb",
".mfp": "application/x-shockwave-flash",
".mht": "message/rfc822",
".mhtml": "message/rfc822",
".mi": "application/x-mi",
".mid": "audio/mid",
".midi": "audio/mid",
".mil": "application/x-mil",
".mml": "text/xml",
".mnd": "audio/x-musicnet-download",
".mns": "audio/x-musicnet-stream",
".mocha": "application/x-javascript",
".movie": "video/x-sgi-movie",
".mp1": "audio/mp1",
".mp2": "audio/mp2",
".mp2v": "video/mpeg",
".mp3": "audio/mp3",
".mp4": "video/mpeg4",
".mpa": "video/x-mpg",
".mpd": "application/vnd.ms-project",
".mpe": "video/x-mpeg",
".mpeg": "video/mpg",
".mpg": "video/mpg",
".mpga": "audio/rn-mpeg",
".mpp": "application/vnd.ms-project",
".mps": "video/x-mpeg",
".mpt": "application/vnd.ms-project",
".mpv": "video/mpg",
".mpv2": "video/mpeg",
".mpw": "application/vnd.ms-project",
".mpx": "application/vnd.ms-project",
".mtx": "text/xml",
".mxp": "application/x-mmxp",
".net": "image/pnetvue",
".nrf": "application/x-nrf",
".nws": "message/rfc822",
".odc": "text/x-ms-odc",
".out": "application/x-out",
".p10": "application/pkcs10",
".p12": "application/x-pkcs12",
".p7b": "application/x-pkcs7-certificates",
".p7c": "application/pkcs7-mime",
".p7m": "application/pkcs7-mime",
".p7r": "application/x-pkcs7-certreqresp",
".p7s": "application/pkcs7-signature",
".pc5": "application/x-pc5",
".pci": "application/x-pci",
".pcl": "application/x-pcl",
".pcx": "application/x-pcx",
".pdf": "application/pdf",
".pdx": "application/vnd.adobe.pdx",
".pfx": "application/x-pkcs12",
".pgl": "application/x-pgl",
".pic": "application/x-pic",
".pko": "application/vnd.ms-pki.pko",
".pl": "application/x-perl",
".plg": "text/html",
".pls": "audio/scpls",
".plt": "application/x-plt",
".png": "application/x-png",
".pot": "application/vnd.ms-powerpoint",
".ppa": "application/vnd.ms-powerpoint",
".ppm": "application/x-ppm",
".pps": "application/vnd.ms-powerpoint",
".ppt": "application/x-ppt",
".pr": "application/x-pr",
".prf": "application/pics-rules",
".prn": "application/x-prn",
".prt": "application/x-prt",
".ps": "application/postscript",
".ptn": "application/x-ptn",
".pwz": "application/vnd.ms-powerpoint",
".r3t": "text/vnd.rn-realtext3d",
".ra": "audio/vnd.rn-realaudio",
".ram": "audio/x-pn-realaudio",
".ras": "application/x-ras",
".rat": "application/rat-file",
".rdf": "text/xml",
".rec": "application/vnd.rn-recording",
".red": "application/x-red",
".rgb": "application/x-rgb",
".rjs": "application/vnd.rn-realsystem-rjs",
".rjt": "application/vnd.rn-realsystem-rjt",
".rlc": "application/x-rlc",
".rle": "application/x-rle",
".rm": "application/vnd.rn-realmedia",
".rmf": "application/vnd.adobe.rmf",
".rmi": "audio/mid",
".rmj": "application/vnd.rn-realsystem-rmj",
".rmm": "audio/x-pn-realaudio",
".rmp": "application/vnd.rn-rn_music_package",
".rms": "application/vnd.rn-realmedia-secure",
".rmvb": "application/vnd.rn-realmedia-vbr",
".rmx": "application/vnd.rn-realsystem-rmx",
".rnx": "application/vnd.rn-realplayer",
".rp": "image/vnd.rn-realpix",
".rpm": "audio/x-pn-realaudio-plugin",
".rsml": "application/vnd.rn-rsml",
".rt": "text/vnd.rn-realtext",
".rtf": "application/x-rtf",
".rv": "video/vnd.rn-realvideo",
".sam": "application/x-sam",
".sat": "application/x-sat",
".sdp": "application/sdp",
".sdw": "application/x-sdw",
".sit": "application/x-stuffit",
".slb": "application/x-slb",
".sld": "application/x-sld",
".slk": "drawing/x-slk",
".smi": "application/smil",
".smil": "application/smil",
".smk": "application/x-smk",
".snd": "audio/basic",
".sol": "text/plain",
".sor": "text/plain",
".spc": "application/x-pkcs7-certificates",
".spl": "application/futuresplash",
".spp": "text/xml",
".ssm": "application/streamingmedia",
".sst": "application/vnd.ms-pki.certstore",
".stl": "application/vnd.ms-pki.stl",
".stm": "text/html",
".sty": "application/x-sty",
".svg": "text/xml",
".swf": "application/x-shockwave-flash",
".tdf": "application/x-tdf",
".tg4": "application/x-tg4",
".tga": "application/x-tga",
".tiff": "image/tiff",
".tld": "text/xml",
".top": "drawing/x-top",
".torrent": "application/x-bittorrent",
".tsd": "text/xml",
".txt": "text/plain",
".uin": "application/x-icq",
".uls": "text/iuls",
".vcf": "text/x-vcard",
".vda": "application/x-vda",
".vdx": "application/vnd.visio",
".vml": "text/xml",
".vpg": "application/x-vpeg005",
".vsd": "application/x-vsd",
".vss": "application/vnd.visio",
".vst": "application/x-vst",
".vsw": "application/vnd.visio",
".vsx": "application/vnd.visio",
".vtx": "application/vnd.visio",
".vxml": "text/xml",
".wav": "audio/wav",
".wax": "audio/x-ms-wax",
".wb1": "application/x-wb1",
".wb2": "application/x-wb2",
".wb3": "application/x-wb3",
".wbmp": "image/vnd.wap.wbmp",
".wiz": "application/msword",
".wk3": "application/x-wk3",
".wk4": "application/x-wk4",
".wkq": "application/x-wkq",
".wks": "application/x-wks",
".wm": "video/x-ms-wm",
".wma": "audio/x-ms-wma",
".wmd": "application/x-ms-wmd",
".wmf": "application/x-wmf",
".wml": "text/vnd.wap.wml",
".wmv": "video/x-ms-wmv",
".wmx": "video/x-ms-wmx",
".wmz": "application/x-ms-wmz",
".wp6": "application/x-wp6",
".wpd": "application/x-wpd",
".wpg": "application/x-wpg",
".wpl": "application/vnd.ms-wpl",
".wq1": "application/x-wq1",
".wr1": "application/x-wr1",
".wri": "application/x-wri",
".wrk": "application/x-wrk",
".ws": "application/x-ws",
".ws2": "application/x-ws",
".wsc": "text/scriptlet",
".wsdl": "text/xml",
".wvx": "video/x-ms-wvx",
".xdp": "application/vnd.adobe.xdp",
".xdr": "text/xml",
".xfd": "application/vnd.adobe.xfd",
".xfdf": "application/vnd.adobe.xfdf",
".xhtml": "text/html",
".xls": "application/x-xls",
".xlw": "application/x-xlw",
".xml": "text/xml",
".xpl": "audio/scpls",
".xq": "text/xml",
".xql": "text/xml",
".xquery": "text/xml",
".xsd": "text/xml",
".xsl": "text/xml",
".xslt": "text/xml",
".xwd": "application/x-xwd",
".x_b": "application/x-x_b",
".sis": "application/vnd.symbian.install",
".sisx": "application/vnd.symbian.install",
".x_t": "application/x-x_t",
".ipa": "application/vnd.iphone",
".apk": "application/vnd.android.package-archive",
".xap": "application/x-silverlight-app"
}

三、 总结


  很简单。
  源码发布在github:
  https://github.com/smallyard/webhere
  npm:

  travis:

  请嘲讽(✿◡‿◡)
页: [1]
查看完整版本: 写一个 nodejs npm应用