Nodejs 路由封装 封装一个类似 express 的路由

1、模块化的方式封装

在这里插入图片描述

routes.js:


const http = require('http');
const fs = require('fs');
const path = require('path')
const url = require('url')
const ejs = require('ejs')
let getFileMime = function (extname) {// 把异步读取文件方法改为同步读取文件方法let data = fs.readFileSync('./data/mime.json');let mimeObj = JSON.parse(data.toString())console.log(mimeObj[extname])return mimeObj[extname]
}
let app = {static: (req, res, staticPath) => {// 1. 获取地址console.log(req.url)let pathname = url.parse(req.url).pathname// 默认加载index.htmlif (pathname == '/') {pathname = '/index.html'} else {pathname = pathname}// 获取路径中的后缀名let extname = path.extname(pathname)// 2.通过fs模块读取文件if (pathname != '/favicon.ico') {try {// 把异步读取文件方法改为同步读取文件方法let data = fs.readFileSync('./' + staticPath + pathname);if (data) {let mine = getFileMime(extname)res.writeHead(200, { 'Content-Type': '' + mine + ';charset="utf-8"' });res.end(data);}} catch (error) {}}},login: (req, res) => {ejs.renderFile('./views/form.ejs',{}, (err,data)=> {res.writeHead(200, {'Content-Type': 'text/html;charset="utf-8"'})  res.end(data)})},doLogin: (req, res)=> {// 获取post传值let postData = '';//以流的方式读取req.on('data', (chunk)=> {postData += chunk;})// 当流读取结束,会触发endreq.on('end', ()=> {console.log(postData);res.end(postData);})}, error: (req, res)=> {res.end('error!')}}module.exports = app;
/* 
调用方式:1. app.login(req,res)2. app['login](req,res)*/

app.js:
在这里插入图片描述

// nodejs 创建一个静态资源服务器const http = require('http');
const url = require('url');
const routes = require('./module/routes')
const ejs = require('ejs')
http.createServer(function (req, res) {// 创建静态web服务器routes.static(req, res, 'static')// 路由let pathname = url.parse(req.url).pathname;// http://127.0.0.1:3000/login  pathname = /loginpathname = pathname.replace("/", "") try {routes[pathname](req, res)} catch (error) {routes['error'](req, res)}// 获取请求类型console.log(req.method)/* if (pathname == '/login') {ejs.renderFile('./views/form.ejs', {}, (err, data)=> {res.writeHead(200, { 'Content-Type': 'text/html;charset="utf-8"' });res.end(data)}) *//* // 获取get传值var query = url.parse(req.url, true).queryconsole.log(query)res.writeHead(200, { 'Content-Type': 'text/html;charset="utf-8"' });res.end('get传值获取成功') *//* res.writeHead(200, { 'Content-Type': 'text/html;charset="utf-8"' });res.end("执行登录") *//*  let msg = "数据库里面获取的数据";let list = [{title: '新闻111'},{title: '新闻222'},{title: '新闻333'},{title: '新闻444'},{title: '新闻555'},]ejs.renderFile('./views/login.ejs', {msg: msg,list: list}, (err, data)=> {res.writeHead(200, { 'Content-Type': 'text/html;charset="utf-8"' });res.end(data)}) *//* } else if (pathname == '/doLogin') {// 获取post传值let postData = '';//以流的方式读取req.on('data', (chunk)=> {postData += chunk;})// 当流读取结束,会触发endreq.on('end', ()=> {console.log(postData);res.end(postData);})} else if (pathname == '/admin') {res.writeHead(200, { 'Content-Type': 'text/html;charset="utf-8"' });res.end("处理客户端的业务逻辑")} else {res.writeHead(404, { 'Content-Type': 'text/html;charset="utf-8"' });res.end("页面不存在")}*/
}).listen(8081);console.log('Server running at http://127.0.0.1:8081/');

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1、封装仿照 express 的路由

Express 官网:https://www.expressjs.com.cn/

var express = require('express') 
var app = express() 
app.get("/", function (req, res) { res.send('hello world') 
})app.get("/login", function (req, res) { res.send('hello world') 
})app.post("/doLogin", function (req, res) { res.send('POST request to the homepage') 
})

在这里插入图片描述

2. 按照express框架的调用方式来封装路由:
1. 封装get方法的路由

routes.js:

const url = require('url')let G = {}
let app = function (req, res) {// 路由let pathname = url.parse(req.url).pathname;// http://127.0.0.1:3000/login  pathname = /loginif (G[pathname]) {G[pathname](req, res); // 表示执行方法}else {res.writeHead(404, {'Content-Type': 'text/html;charset="utf-8"'});res.end('页面不存在');}
}
app.get = function (string, callback) {// 注册方法G[string] = callback/* G['/login'] = function(req, res) {res.send('hello world')}*/// console.log('get方法')
}
app.post = function () {console.log('post方法')
}module.exports = app

app.js :

const http = require("http");
const app = require('./module/routes')// 注册web服务
http.createServer(app).listen(3000);console.log('Server running at http://127.0.0.1:3000/');// 配置路由
app.get('/', function(req, res) {res.writeHead(200, {'Content-Type': 'text/html;charset="utf-8"'});res.end('首页');
})// 配置路由
app.get('/login', function(req, res) {res.writeHead(200, {'Content-Type': 'text/html;charset="utf-8"'});res.end('执行登录操作');
})

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2. 在上面代码的基础上

1)封装post方法的路由
在这里插入图片描述

2)以及扩展res的方法,即为res增加一个send()
在这里插入图片描述

3)把get 和 post分开保存
在这里插入图片描述
在这里插入图片描述

routes.js :

const url = require('url')function changeRes(res) {res.send = (data) => {res.writeHead(200, { 'Content-Type': 'text/html;charset="utf-8"' });res.end(data);}
}let server = () => {let G = {}// 把get 和 post分开保存G._get = {}G._post = {}let app = function (req, res) {// 扩展res的方法changeRes(res)// 路由let pathname = url.parse(req.url).pathname;// http://127.0.0.1:3000/login  pathname = /login// 获取请求类型let method = req.method.toLowerCase()if (G['_' + method][pathname]) {if (method == "get") {G['_' + method][pathname](req, res); // 表示执行方法} else {// post  获取post的数据  把它绑定到req.body上let postData = '';req.on('data', (chunk) => {postData += chunk;})req.on('end', () => {console.log(postData)req.body = postDataG._post[pathname](req, res); // 表示执行方法})}} else {res.writeHead(404, { 'Content-Type': 'text/html;charset="utf-8"' });res.end('页面不存在');}}app.get = function (string, callback) {// 注册方法G._get[string] = callback/* G['/login'] = function(req, res) {res.send('hello world')}*/// console.log('get方法')}app.post = function (string, callback) {// 注册方法G._post[string] = callback}return app;}
module.exports = server()

app.js :

const http = require("http");
const ejs = require('ejs');
const app = require('./module/routes');// 注册web服务
http.createServer(app).listen(3000);console.log('Server running at http://127.0.0.1:3000/');// 配置路由
app.get('/', function (req, res) {res.send('首页');
})// 配置路由
app.get('/login', function (req, res) {ejs.renderFile('./views/form.ejs', {}, (err, data) => {res.send(data)})
})app.post('/doLogin', function (req, res) {res.send('执行登录操作' + req.body);
})

在这里插入图片描述

2. 封装静态web资源服务:

当页面中引入了类似js, img,css等文件时,会出现这些静态资源访问不到的问题,如下所示:
在这里插入图片描述

  1. 定义getFileMime方法,根据文件后缀名获取文件类型:
    在这里插入图片描述

mime.json:


{ ".323":"text/h323" ,".3gp":"video/3gpp" ,".aab":"application/x-authoware-bin" ,".aam":"application/x-authoware-map" ,".aas":"application/x-authoware-seg" ,".acx":"application/internet-property-stream" ,".ai":"application/postscript" ,".aif":"audio/x-aiff" ,".aifc":"audio/x-aiff" ,".aiff":"audio/x-aiff" ,".als":"audio/X-Alpha5" ,".amc":"application/x-mpeg" ,".ani":"application/octet-stream" ,".apk":"application/vnd.android.package-archive" ,".asc":"text/plain" ,".asd":"application/astound" ,".asf":"video/x-ms-asf" ,".asn":"application/astound" ,".asp":"application/x-asap" ,".asr":"video/x-ms-asf" ,".asx":"video/x-ms-asf" ,".au":"audio/basic" ,".avb":"application/octet-stream" ,".avi":"video/x-msvideo" ,".awb":"audio/amr-wb" ,".axs":"application/olescript" ,".bas":"text/plain" ,".bcpio":"application/x-bcpio" ,".bin ":"application/octet-stream" ,".bld":"application/bld" ,".bld2":"application/bld2" ,".bmp":"image/bmp" ,".bpk":"application/octet-stream" ,".bz2":"application/x-bzip2" ,".c":"text/plain" ,".cal":"image/x-cals" ,".cat":"application/vnd.ms-pkiseccat" ,".ccn":"application/x-cnc" ,".cco":"application/x-cocoa" ,".cdf":"application/x-cdf" ,".cer":"application/x-x509-ca-cert" ,".cgi":"magnus-internal/cgi" ,".chat":"application/x-chat" ,".class":"application/octet-stream" ,".clp":"application/x-msclip" ,".cmx":"image/x-cmx" ,".co":"application/x-cult3d-object" ,".cod":"image/cis-cod" ,".conf":"text/plain" ,".cpio":"application/x-cpio" ,".cpp":"text/plain" ,".cpt":"application/mac-compactpro" ,".crd":"application/x-mscardfile" ,".crl":"application/pkix-crl" ,".crt":"application/x-x509-ca-cert" ,".csh":"application/x-csh" ,".csm":"chemical/x-csml" ,".csml":"chemical/x-csml" ,".css":"text/css" ,".cur":"application/octet-stream" ,".dcm":"x-lml/x-evm" ,".dcr":"application/x-director" ,".dcx":"image/x-dcx" ,".der":"application/x-x509-ca-cert" ,".dhtml":"text/html" ,".dir":"application/x-director" ,".dll":"application/x-msdownload" ,".dmg":"application/octet-stream" ,".dms":"application/octet-stream" ,".doc":"application/msword" ,".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document" ,".dot":"application/msword" ,".dvi":"application/x-dvi" ,".dwf":"drawing/x-dwf" ,".dwg":"application/x-autocad" ,".dxf":"application/x-autocad" ,".dxr":"application/x-director" ,".ebk":"application/x-expandedbook" ,".emb":"chemical/x-embl-dl-nucleotide" ,".embl":"chemical/x-embl-dl-nucleotide" ,".eps":"application/postscript" ,".epub":"application/epub+zip" ,".eri":"image/x-eri" ,".es":"audio/echospeech" ,".esl":"audio/echospeech" ,".etc":"application/x-earthtime" ,".etx":"text/x-setext" ,".evm":"x-lml/x-evm" ,".evy":"application/envoy" ,".exe":"application/octet-stream" ,".fh4":"image/x-freehand" ,".fh5":"image/x-freehand" ,".fhc":"image/x-freehand" ,".fif":"application/fractals" ,".flr":"x-world/x-vrml" ,".flv":"flv-application/octet-stream" ,".fm":"application/x-maker" ,".fpx":"image/x-fpx" ,".fvi":"video/isivideo" ,".gau":"chemical/x-gaussian-input" ,".gca":"application/x-gca-compressed" ,".gdb":"x-lml/x-gdb" ,".gif":"image/gif" ,".gps":"application/x-gps" ,".gtar":"application/x-gtar" ,".gz":"application/x-gzip" ,".h":"text/plain" ,".hdf":"application/x-hdf" ,".hdm":"text/x-hdml" ,".hdml":"text/x-hdml" ,".hlp":"application/winhlp" ,".hqx":"application/mac-binhex40" ,".hta":"application/hta" ,".htc":"text/x-component" ,".htm":"text/html" ,".html":"text/html" ,".hts":"text/html" ,".htt":"text/webviewhtml" ,".ice":"x-conference/x-cooltalk" ,".ico":"image/x-icon" ,".ief":"image/ief" ,".ifm":"image/gif" ,".ifs":"image/ifs" ,".iii":"application/x-iphone" ,".imy":"audio/melody" ,".ins":"application/x-internet-signup" ,".ips":"application/x-ipscript" ,".ipx":"application/x-ipix" ,".isp":"application/x-internet-signup" ,".it":"audio/x-mod" ,".itz":"audio/x-mod" ,".ivr":"i-world/i-vrml" ,".j2k":"image/j2k" ,".jad":"text/vnd.sun.j2me.app-descriptor" ,".jam":"application/x-jam" ,".jar":"application/java-archive" ,".java":"text/plain" ,".jfif":"image/pipeg" ,".jnlp":"application/x-java-jnlp-file" ,".jpe":"image/jpeg" ,".jpeg":"image/jpeg" ,".jpg":"image/jpeg" ,".jpz":"image/jpeg" ,".js":"application/x-javascript" ,".jwc":"application/jwc" ,".kjx":"application/x-kjx" ,".lak":"x-lml/x-lak" ,".latex":"application/x-latex" ,".lcc":"application/fastman" ,".lcl":"application/x-digitalloca" ,".lcr":"application/x-digitalloca" ,".lgh":"application/lgh" ,".lha":"application/octet-stream" ,".lml":"x-lml/x-lml" ,".lmlpack":"x-lml/x-lmlpack" ,".log":"text/plain" ,".lsf":"video/x-la-asf" ,".lsx":"video/x-la-asf" ,".lzh":"application/octet-stream" ,".m13":"application/x-msmediaview" ,".m14":"application/x-msmediaview" ,".m15":"audio/x-mod" ,".m3u":"audio/x-mpegurl" ,".m3url":"audio/x-mpegurl" ,".m4a":"audio/mp4a-latm" ,".m4b":"audio/mp4a-latm" ,".m4p":"audio/mp4a-latm" ,".m4u":"video/vnd.mpegurl" ,".m4v":"video/x-m4v" ,".ma1":"audio/ma1" ,".ma2":"audio/ma2" ,".ma3":"audio/ma3" ,".ma5":"audio/ma5" ,".man":"application/x-troff-man" ,".map":"magnus-internal/imagemap" ,".mbd":"application/mbedlet" ,".mct":"application/x-mascot" ,".mdb":"application/x-msaccess" ,".mdz":"audio/x-mod" ,".me":"application/x-troff-me" ,".mel":"text/x-vmel" ,".mht":"message/rfc822" ,".mhtml":"message/rfc822" ,".mi":"application/x-mif" ,".mid":"audio/mid" ,".midi":"audio/midi" ,".mif":"application/x-mif" ,".mil":"image/x-cals" ,".mio":"audio/x-mio" ,".mmf":"application/x-skt-lbs" ,".mng":"video/x-mng" ,".mny":"application/x-msmoney" ,".moc":"application/x-mocha" ,".mocha":"application/x-mocha" ,".mod":"audio/x-mod" ,".mof":"application/x-yumekara" ,".mol":"chemical/x-mdl-molfile" ,".mop":"chemical/x-mopac-input" ,".mov":"video/quicktime" ,".movie":"video/x-sgi-movie" ,".mp2":"video/mpeg" ,".mp3":"audio/mpeg" ,".mp4":"video/mp4" ,".mpa":"video/mpeg" ,".mpc":"application/vnd.mpohun.certificate" ,".mpe":"video/mpeg" ,".mpeg":"video/mpeg" ,".mpg":"video/mpeg" ,".mpg4":"video/mp4" ,".mpga":"audio/mpeg" ,".mpn":"application/vnd.mophun.application" ,".mpp":"application/vnd.ms-project" ,".mps":"application/x-mapserver" ,".mpv2":"video/mpeg" ,".mrl":"text/x-mrml" ,".mrm":"application/x-mrm" ,".ms":"application/x-troff-ms" ,".msg":"application/vnd.ms-outlook" ,".mts":"application/metastream" ,".mtx":"application/metastream" ,".mtz":"application/metastream" ,".mvb":"application/x-msmediaview" ,".mzv":"application/metastream" ,".nar":"application/zip" ,".nbmp":"image/nbmp" ,".nc":"application/x-netcdf" ,".ndb":"x-lml/x-ndb" ,".ndwn":"application/ndwn" ,".nif":"application/x-nif" ,".nmz":"application/x-scream" ,".nokia-op-logo":"image/vnd.nok-oplogo-color" ,".npx":"application/x-netfpx" ,".nsnd":"audio/nsnd" ,".nva":"application/x-neva1" ,".nws":"message/rfc822" ,".oda":"application/oda" ,".ogg":"audio/ogg" ,".oom":"application/x-AtlasMate-Plugin" ,".p10":"application/pkcs10" ,".p12":"application/x-pkcs12" ,".p7b":"application/x-pkcs7-certificates" ,".p7c":"application/x-pkcs7-mime" ,".p7m":"application/x-pkcs7-mime" ,".p7r":"application/x-pkcs7-certreqresp" ,".p7s":"application/x-pkcs7-signature" ,".pac":"audio/x-pac" ,".pae":"audio/x-epac" ,".pan":"application/x-pan" ,".pbm":"image/x-portable-bitmap" ,".pcx":"image/x-pcx" ,".pda":"image/x-pda" ,".pdb":"chemical/x-pdb" ,".pdf":"application/pdf" ,".pfr":"application/font-tdpfr" ,".pfx":"application/x-pkcs12" ,".pgm":"image/x-portable-graymap" ,".pict":"image/x-pict" ,".pko":"application/ynd.ms-pkipko" ,".pm":"application/x-perl" ,".pma":"application/x-perfmon" ,".pmc":"application/x-perfmon" ,".pmd":"application/x-pmd" ,".pml":"application/x-perfmon" ,".pmr":"application/x-perfmon" ,".pmw":"application/x-perfmon" ,".png":"image/png" ,".pnm":"image/x-portable-anymap" ,".pnz":"image/png" ,".pot,":"application/vnd.ms-powerpoint" ,".ppm":"image/x-portable-pixmap" ,".pps":"application/vnd.ms-powerpoint" ,".ppt":"application/vnd.ms-powerpoint" ,".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation" ,".pqf":"application/x-cprplayer" ,".pqi":"application/cprplayer" ,".prc":"application/x-prc" ,".prf":"application/pics-rules" ,".prop":"text/plain" ,".proxy":"application/x-ns-proxy-autoconfig" ,".ps":"application/postscript" ,".ptlk":"application/listenup" ,".pub":"application/x-mspublisher" ,".pvx":"video/x-pv-pvx" ,".qcp":"audio/vnd.qcelp" ,".qt":"video/quicktime" ,".qti":"image/x-quicktime" ,".qtif":"image/x-quicktime" ,".r3t":"text/vnd.rn-realtext3d" ,".ra":"audio/x-pn-realaudio" ,".ram":"audio/x-pn-realaudio" ,".rar":"application/octet-stream" ,".ras":"image/x-cmu-raster" ,".rc":"text/plain" ,".rdf":"application/rdf+xml" ,".rf":"image/vnd.rn-realflash" ,".rgb":"image/x-rgb" ,".rlf":"application/x-richlink" ,".rm":"audio/x-pn-realaudio" ,".rmf":"audio/x-rmf" ,".rmi":"audio/mid" ,".rmm":"audio/x-pn-realaudio" ,".rmvb":"audio/x-pn-realaudio" ,".rnx":"application/vnd.rn-realplayer" ,".roff":"application/x-troff" ,".rp":"image/vnd.rn-realpix" ,".rpm":"audio/x-pn-realaudio-plugin" ,".rt":"text/vnd.rn-realtext" ,".rte":"x-lml/x-gps" ,".rtf":"application/rtf" ,".rtg":"application/metastream" ,".rtx":"text/richtext" ,".rv":"video/vnd.rn-realvideo" ,".rwc":"application/x-rogerwilco" ,".s3m":"audio/x-mod" ,".s3z":"audio/x-mod" ,".sca":"application/x-supercard" ,".scd":"application/x-msschedule" ,".sct":"text/scriptlet" ,".sdf":"application/e-score" ,".sea":"application/x-stuffit" ,".setpay":"application/set-payment-initiation" ,".setreg":"application/set-registration-initiation" ,".sgm":"text/x-sgml" ,".sgml":"text/x-sgml" ,".sh":"application/x-sh" ,".shar":"application/x-shar" ,".shtml":"magnus-internal/parsed-html" ,".shw":"application/presentations" ,".si6":"image/si6" ,".si7":"image/vnd.stiwap.sis" ,".si9":"image/vnd.lgtwap.sis" ,".sis":"application/vnd.symbian.install" ,".sit":"application/x-stuffit" ,".skd":"application/x-Koan" ,".skm":"application/x-Koan" ,".skp":"application/x-Koan" ,".skt":"application/x-Koan" ,".slc":"application/x-salsa" ,".smd":"audio/x-smd" ,".smi":"application/smil" ,".smil":"application/smil" ,".smp":"application/studiom" ,".smz":"audio/x-smd" ,".snd":"audio/basic" ,".spc":"application/x-pkcs7-certificates" ,".spl":"application/futuresplash" ,".spr":"application/x-sprite" ,".sprite":"application/x-sprite" ,".sdp":"application/sdp" ,".spt":"application/x-spt" ,".src":"application/x-wais-source" ,".sst":"application/vnd.ms-pkicertstore" ,".stk":"application/hyperstudio" ,".stl":"application/vnd.ms-pkistl" ,".stm":"text/html" ,".svg":"image/svg+xml" ,".sv4cpio":"application/x-sv4cpio" ,".sv4crc":"application/x-sv4crc" ,".svf":"image/vnd" ,".svg":"image/svg+xml" ,".svh":"image/svh" ,".svr":"x-world/x-svr" ,".swf":"application/x-shockwave-flash" ,".swfl":"application/x-shockwave-flash" ,".t":"application/x-troff" ,".tad":"application/octet-stream" ,".talk":"text/x-speech" ,".tar":"application/x-tar" ,".taz":"application/x-tar" ,".tbp":"application/x-timbuktu" ,".tbt":"application/x-timbuktu" ,".tcl":"application/x-tcl" ,".tex":"application/x-tex" ,".texi":"application/x-texinfo" ,".texinfo":"application/x-texinfo" ,".tgz":"application/x-compressed" ,".thm":"application/vnd.eri.thm" ,".tif":"image/tiff" ,".tiff":"image/tiff" ,".tki":"application/x-tkined" ,".tkined":"application/x-tkined" ,".toc":"application/toc" ,".toy":"image/toy" ,".tr":"application/x-troff" ,".trk":"x-lml/x-gps" ,".trm":"application/x-msterminal" ,".tsi":"audio/tsplayer" ,".tsp":"application/dsptype" ,".tsv":"text/tab-separated-values" ,".ttf":"application/octet-stream" ,".ttz":"application/t-time" ,".txt":"text/plain" ,".uls":"text/iuls" ,".ult":"audio/x-mod" ,".ustar":"application/x-ustar" ,".uu":"application/x-uuencode" ,".uue":"application/x-uuencode" ,".vcd":"application/x-cdlink" ,".vcf":"text/x-vcard" ,".vdo":"video/vdo" ,".vib":"audio/vib" ,".viv":"video/vivo" ,".vivo":"video/vivo" ,".vmd":"application/vocaltec-media-desc" ,".vmf":"application/vocaltec-media-file" ,".vmi":"application/x-dreamcast-vms-info" ,".vms":"application/x-dreamcast-vms" ,".vox":"audio/voxware" ,".vqe":"audio/x-twinvq-plugin" ,".vqf":"audio/x-twinvq" ,".vql":"audio/x-twinvq" ,".vre":"x-world/x-vream" ,".vrml":"x-world/x-vrml" ,".vrt":"x-world/x-vrt" ,".vrw":"x-world/x-vream" ,".vts":"workbook/formulaone" ,".wav":"audio/x-wav" ,".wax":"audio/x-ms-wax" ,".wbmp":"image/vnd.wap.wbmp" ,".wcm":"application/vnd.ms-works" ,".wdb":"application/vnd.ms-works" ,".web":"application/vnd.xara" ,".wi":"image/wavelet" ,".wis":"application/x-InstallShield" ,".wks":"application/vnd.ms-works" ,".wm":"video/x-ms-wm" ,".wma":"audio/x-ms-wma" ,".wmd":"application/x-ms-wmd" ,".wmf":"application/x-msmetafile" ,".wml":"text/vnd.wap.wml" ,".wmlc":"application/vnd.wap.wmlc" ,".wmls":"text/vnd.wap.wmlscript" ,".wmlsc":"application/vnd.wap.wmlscriptc" ,".wmlscript":"text/vnd.wap.wmlscript" ,".wmv":"audio/x-ms-wmv" ,".wmx":"video/x-ms-wmx" ,".wmz":"application/x-ms-wmz" ,".wpng":"image/x-up-wpng" ,".wps":"application/vnd.ms-works" ,".wpt":"x-lml/x-gps" ,".wri":"application/x-mswrite" ,".wrl":"x-world/x-vrml" ,".wrz":"x-world/x-vrml" ,".ws":"text/vnd.wap.wmlscript" ,".wsc":"application/vnd.wap.wmlscriptc" ,".wv":"video/wavelet" ,".wvx":"video/x-ms-wvx" ,".wxl":"application/x-wxl" ,".x-gzip":"application/x-gzip" ,".xaf":"x-world/x-vrml" ,".xar":"application/vnd.xara" ,".xbm":"image/x-xbitmap" ,".xdm":"application/x-xdma" ,".xdma":"application/x-xdma" ,".xdw":"application/vnd.fujixerox.docuworks" ,".xht":"application/xhtml+xml" ,".xhtm":"application/xhtml+xml" ,".xhtml":"application/xhtml+xml" ,".xla":"application/vnd.ms-excel" ,".xlc":"application/vnd.ms-excel" ,".xll":"application/x-excel" ,".xlm":"application/vnd.ms-excel" ,".xls":"application/vnd.ms-excel" ,".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ,".xlt":"application/vnd.ms-excel" ,".xlw":"application/vnd.ms-excel" ,".xm":"audio/x-mod" ,".xml":"text/plain",".xml":"application/xml",".xmz":"audio/x-mod" ,".xof":"x-world/x-vrml" ,".xpi":"application/x-xpinstall" ,".xpm":"image/x-xpixmap" ,".xsit":"text/xml" ,".xsl":"text/xml" ,".xul":"text/xul" ,".xwd":"image/x-xwindowdump" ,".xyz":"chemical/x-pdb" ,".yz1":"application/x-yz1" ,".z":"application/x-compress" ,".zac":"application/x-zaurus-zac" ,".zip":"application/zip" ,".json":"application/json"
}
  1. 定义静态web服务方法initStatic()
    在这里插入图片描述
  2. 在app方法中调用initStatic()
    在这里插入图片描述
  3. 设置静态资源目录
    在这里插入图片描述
  4. 然后就能够加载到css等静态资源
    在这里插入图片描述

routes.js :

const url = require('url')
const path = require('path')
const fs = require('fs')// 扩展res
function changeRes(res) {res.send = (data) => {res.writeHead(200, { 'Content-Type': 'text/html;charset="utf-8"' });res.end(data);}
}// 根据后缀名获取文件类型
let getFileMime = function (extname) {// 把异步读取文件方法改为同步读取文件方法let data = fs.readFileSync('./data/mime.json');let mimeObj = JSON.parse(data.toString())console.log(mimeObj[extname])return mimeObj[extname]
}// 静态web服务的方法
function initStatic (req, res, staticPath){// 1. 获取地址console.log(req.url)let pathname = url.parse(req.url).pathname// 默认加载index.htmlif (pathname == '/') {pathname = '/index.html'} else {pathname = pathname}// 获取路径中的后缀名let extname = path.extname(pathname)// 2.通过fs模块读取文件try {// 把异步读取文件方法改为同步读取文件方法let data = fs.readFileSync('./' + staticPath + pathname);if (data) {let mine = getFileMime(extname)res.writeHead(200, { 'Content-Type': '' + mine + ';charset="utf-8"' });res.end(data);}} catch (error) {}
}let server = () => {let G = {_get: {}, // 把get 和 post分开保存_post: {},staticPath: "static"  // 设置默认的静态资源web目录}let app = function (req, res) {// 扩展res的方法changeRes(res)// 配置静态web服务器initStatic(req, res, G.staticPath)// 路由let pathname = url.parse(req.url).pathname;// http://127.0.0.1:3000/login  pathname = /login// 获取请求类型let method = req.method.toLowerCase()if (G['_' + method][pathname]) {if (method == "get") {G['_' + method][pathname](req, res); // 表示执行方法} else {// post  获取post的数据  把它绑定到req.body上let postData = '';req.on('data', (chunk) => {postData += chunk;})req.on('end', () => {console.log(postData)req.body = postDataG._post[pathname](req, res); // 表示执行方法})}} else {res.writeHead(404, { 'Content-Type': 'text/html;charset="utf-8"' });res.end('页面不存在');}}app.get = function (string, callback) {// 注册方法G._get[string] = callback/* G['/login'] = function(req, res) {res.send('hello world')}*/// console.log('get方法')}app.post = function (string, callback) {// 注册方法G._post[string] = callback}// 配置静态web服务目录app.static = function (staticPath){G.staticPath = staticPath}return app;}
module.exports = server()

app.js :

const http = require("http");
const ejs = require('ejs');
const app = require('./module/routes');// 注册web服务
http.createServer(app).listen(3000);console.log('Server running at http://127.0.0.1:3000/');// 修改默认静态web目录
app.static("public");// 配置路由
app.get('/', function (req, res) {res.send('首页');
})// 配置路由
app.get('/login', function (req, res) {ejs.renderFile('./views/form.ejs', {}, (err, data) => {res.send(data)})
})app.post('/doLogin', function (req, res) {res.send('执行登录操作' + req.body);
})

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天翼网关 ddns设置_19,微服务网关之Zuul

这一次给大家分享微服务网关的相关知识,这个也是微服务架构中,相当重要的组件之一,来,下面听我徐徐道来1,API网关概览1.1,现有的交互模式存在什么问题?目前,是客户端会直接跟多个微服…

利用bds和dfs解决 LeetCode 107. Binary Tree Level Order Traversal II

问题简述 给定一棵二叉树,返回该二叉树自底向上遍历的结点值(即从左到右,自底向上) 比如给定一颗二叉树 [3,9,20,null,null,15,7] 3/ \9 20/ \15 7 返回的结果为 [[15,7],[9,20],[3] ] 解决方案 解法1:广度优…

MongoDB 数据库创建、删除、表(集合) 创建删除、数据的增、删、改、查

一、 连接数据库 1、连接数据库 清屏命令:cls 查看所有数据库列表:show dbs 二、 创建数据库、查看、删除数据库 1、使用数据库、创建数据库 use itying 如果真的想把这个数据库创建成功,那么必须插入一个数据。 数据库中不能直接插入数据&#xff0…

纯CSS方块转化梯形动画

http://jasonning92.github.io/JasonsBlog/pages/%E7%BA%AFCSS%E6%96%B9%E5%9D%97%E8%BD%AC%E5%8C%96%E6%A2%AF%E5%BD%A2%E5%8A%A8%E7%94%BB.html转载于:https://www.cnblogs.com/sanqianjin/p/5439364.html

如何编程两个android 手机进行通信_100+ 队伍激烈角逐 Geek Online 2020 编程挑战赛完美收官 - 业界动态...

2020春季的一场疫情,让远程办公和在线教育在全球范围内成为一种常态。疫情终将过去,但疫情为人们带来的新的工作及生活方式却将持续地影响着我们。后疫情时代,远程实时互动技术的重要性被提到了新的高度,下一代互联网通信云将如何…

从LeetCode 210. Course Schedule II 了解拓扑排序

问题简述 给定n节课,每节课按0~n-1编号。 在修某些课的时候需要有其它课的基础,必须先上先修课。现在用pair的形式来表示要先修的课,比如 [ [0,1], [1,2] ] 就表示在修课程1之前必须先修课程0,修课程2之前必须修课程1。现在需要给…

LeetCode题解 343.Integer Break

题目:Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get. For example, given n 2, return 1 (2 1 1); given n 10, return 36 (10 …

MongoDb 大数据查询优化、 MongoDB 索引、复合索引、唯一索引、 explain 分 析查询速度

一、索引基础 索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得 更快。 MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询优化技巧。 下面是创建索引的命令: db.user.ensureIndex…

ipconfig不是内部或外部_晶振有什么作用,如何选择合适的晶振,为什么有时候用内部晶振?...

一、 什么是晶振晶振,全名叫"晶体振荡器",它在电路当中起到产生振荡频率的作用,我们都知道,单片机可以看成是在时钟驱动下的时序逻辑电路,那么这个所需要的时钟就是晶振来产生,可以说它的单片机的…

利用哈希表和dfs解决LeetCode 399. Evaluate Division

问题简介 给定一些由变量组成的等式组,然后根据这些等式推算出所闻的等式的结果,如果无法推算,则返回-1.0。 比如: 给定等式组 a / b 2.0, b / c 3.0 求出 a / c ?, b / a ?, a / e ?, a / a ?, x / x ? 返回结果为…

Mongodb 账户权限配置

Mongodb 账户权限配置 1、第一步创建超级管理用户 use admindb.createUser({ user:admin, pwd:admin, roles:[{role:root,db:admin}] })2、第二步修改 Mongodb 数据库配置文件 默认路径:路径:C:\Program Files\MongoDB\Server\4.0\bin\mongod.cfg 打开…

笔记本电脑关机快捷键_2020年双十一值得入手的高性价比笔记本电脑外设推荐...

本文更新日期:2020.10.21 篇幅较长,请提前收藏关注电脑外设就是除主机外的大部分硬件设备都可称作外部设备,或叫外围设备,简称外设。计算机系统没有输入输出设备,就如计算机系统没有软件一样,是毫无意义的。…

CentOS 7 gedit编辑器中文乱码解决方法

无需root登陆 打开终端输入如下命令: gsettings set org.gnome.gedit.preferences.encodings auto-detected "[GB18030, GB2312, GBK, UTF-8, BIG5, CURRENT, UTF-16]" gsettings set org.gnome.gedit.preferences.encodings shown-in-menu "[GB1803…

MongoDB 的高级查询 aggregate 聚合管道

一、MongoDB 聚合管道&#xff08;Aggregation Pipeline&#xff09; 使用聚合管道可以对集合中的文档进行变换和组合。 实际项目&#xff1a;表关联查询、数据的统计。 MongoDB 中使用 db.COLLECTION_NAME.aggregate([{<stage>},...]) 方法 来构建和使用聚合管道。 先…

python函数在传参的时候,到底在传些什么?

C这样的语言用多了之后&#xff0c;在Python函数传递参数的时候&#xff0c;经常会遇到一个问题&#xff0c;我要传递一个引用怎么办&#xff1f; 比如我们想要传一个x到函数中做个运算改变x的值&#xff1a; def change(y):y 1x 1 print ("before change:", x) …

android学习笔记五。2、其他组件

一、ContentProvider内容提供者.是是android中一个应用向第三方共享数据的方式,android中的联系人,sms(短信记录)等都是通过这一方式来向外提供的 1、使用&#xff1a; 在应用中使用ContentProvider提供的数据并不是直接使用的,而是需要通过ContentResolver来实现的,ContentRes…

一维条形码识别c语言_条形码的优点

条形码是迄今为止最经济、实用的一种自动识别技术。条形码技术具有以下几个方面的优点A&#xff0e;输入速度快&#xff1a;与键盘输入相比&#xff0c;条形码输入的速度是键盘输入的5倍&#xff0c;并且能实现“即时数据输入”。B&#xff0e;可靠性高&#xff1a;键盘 输入数…

mongodb数据库导出备份

mongodb数据库导出备份 语法&#xff1a; mongodump-h dbhost-d dbname-o cdbdirectorg 参数说明&#xff1a; “-h:MongDB所在服务器地址&#xff0c;例如&#xff1a;127.0.0.1&#xff0c;当然也可以指定端口号&#xff1a;127.0.0.1&#xff1a;27017 -d&#xff1a;需要…

气象数据领航无人飞行器线路优化大赛解决方案(3rd place)

1 队伍介绍 队伍名称&#xff1a;酒后写诗 队伍成员&#xff1a;陈权、林望黎、黄章炜 队伍名次&#xff1a;3 / 1646 2 问题简介 这个问题说起来其实挺简单&#xff08;但实现起来困难重重&#xff09;&#xff0c;就是提供了气象局得到的10个模型的预测数据&#xff08;…

C#之 十九 使用WinForm控件

十九 使用Win Form控件 比如说电脑有显示器&#xff0c;鼠标&#xff0c;主机以及键盘的基本元素组成。在windows窗体中也有其基本控件&#xff0c;这些控件在每一个窗体中都要用到&#xff0c;也就是说无所不在。有些控件可能外观不同但是他们的使用方式都基本上一样。 …