摘要:框架實現(xiàn)將所有請求方式寫入對象中匹配剩余路由中間件服務(wù)循環(huán)路由,匹配到就執(zhí)行它的函數(shù)用函數(shù)匹配中間件匹配一般路由靜態(tài)資源服務(wù)中間價實現(xiàn)使用
express 框架實現(xiàn)
</>復(fù)制代碼
const http = require("http");
const url = require("url");
function createApp() {
var app = {};
var routes = [];
// 將所有請求方式寫入app對象中
http.METHODS.forEach(method => {
method = method.toLocaleLowerCase();
app[method] = (path, handler) => {
let route = {
path,
method,
handler
};
routes.push(route);
};
});
// 匹配剩余路由
app.all = (path, handler) => {
let route = {
method: "all",
path,
handler
};
routes.push(route);
};
// 中間件
app.use = (path, handler) => {
if(handler === undefined) {
handler = path;
path = "/";
}
let route = {
method: "middle",
path,
handler,
}
routes.push(route);
}
// 服務(wù)
let server = http.createServer((req, res) => {
let method = req.method.toLocaleLowerCase();
let { pathname } = url.parse(req.url, true);
pathname = decodeURI(pathname);
// 循環(huán)路由,匹配到就執(zhí)行它的handler函數(shù)
// 用next函數(shù)
let i = 0;
let next = () => {
if(i >= routes.length) return;
let { method: m, path: p, handler: h } = routes[i];
i++;
if(m === "middle") {
// 匹配中間件
if(p == "/" || p == pathname || pathname.startsWith(p+"/")) {
h(req, res, next);
} else {
next();
}
} else {
// 匹配一般路由
if ((m == method || m == "all") && (p == pathname || p === "*")) {
h(req, res);
} else {
next();
}
}
}
next();
});
app.listen = (...rest) => {
server.listen(...rest);
};
return app;
}
module.exports = createApp;
靜態(tài)資源服務(wù)中間價實現(xiàn)
</>復(fù)制代碼
const path = require("path");
const fs = require("fs");
const url = require("url");
const mime = {
css: "text/css",
gif: "image/gif",
html: "text/html",
ico: "image/x-icon",
jpeg: "image/jpeg",
jpg: "image/jpeg",
js: "text/javascript",
json: "application/json",
pdf: "application/pdf",
png: "image/png",
svg: "image/svg+xml",
swf: "application/x-shockwave-flash",
tiff: "image/tiff",
txt: "text/plain",
wav: "audio/x-wav",
wma: "audio/x-ms-wma",
wmv: "video/x-ms-wmv",
xml: "text/xml",
unknown: "text/plain"
};
function static(basename) {
return (req, res, next) => {
let { pathname } = url.parse(req.url, true);
pathname = decodeURI(pathname);
let p = path.resolve(path.join(basename, pathname));
fs.stat(p, (err, stats) => {
if(err) next();
if(stats && stats.isFile()) {
let ext = path.extname(p).slice(1);
res.writeHead(200, {"content-type": `${mime[ext]};charset=utf-8`})
let rs = fs.createReadStream(p);
rs.pipe(res);
} else {
next();
}
})
}
}
module.exports = static;
使用
</>復(fù)制代碼
const createApp = require("./app/index");
const static = require("./app/static");
let app = createApp();
app.use(static("./static"));
app.all("*", (req, res) => {
res.end("404");
});
app.listen(8080, "127.0.0.1");
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/106846.html
摘要:最近在看,讀完官方的起步教程后想著該自己折騰點東西,就先用實現(xiàn)一個超簡單的,主要記錄下思路。先推薦一個入門級的簡單實戰(zhàn)項目地址。不過鑒于初學(xué),自身的思路肯定不會是最佳實踐,慢慢積累。 最近在看node.js,讀完官方的起步教程后想著該自己折騰點東西,就先用express + ejs實現(xiàn)一個超簡單的webserver,主要記錄下思路。先推薦一個nodejs入門級的簡單實戰(zhàn)項目地址。很適合...
摘要:的官方描述是是一個獨立于中間件和路由的實例,你可以將看作是只能執(zhí)行執(zhí)行中間件和路由的小心應(yīng)用。最大的不同在于只能已模塊形式存在并不能獨立運行。另外,加密的公鑰也被稱為證書。客戶端在拿到公鑰證書后會向這樣的證書頒發(fā)機構(gòu)進行驗證。 showImg(https://segmentfault.com/img/remote/1460000010820582); 作為 Express 中的最大特點...
摘要:一個標準性的事件就是年的橫空出世。引擎快速處理能力和異步編程風(fēng)格,讓開發(fā)者從多線程中解脫了出來。其次,通過異步編程范式將其高并發(fā)的能力發(fā)揮的淋漓盡致。它也僅僅是一個處理請求并作出響應(yīng)的函數(shù),并無任何特殊之處。 showImg(https://segmentfault.com/img/remote/1460000010819116); 在正式學(xué)習(xí) Express 內(nèi)容之前,我們有必要從大...
摘要:而框架中最常用的兩個視圖引擎是和。實際上這些上下文對象就是會在視圖中使用到的變量。其實視圖緩存并不是緩存視圖實際上它緩存的視圖路徑。根據(jù)默認視圖引擎將缺少拓展名的視圖文件補充完整。實際上存在由不同組織維護的兩個不同版本的。 showImg(https://segmentfault.com/img/remote/1460000010821004);前面的內(nèi)容大都是關(guān)于 Express 框...
摘要:作為一個有志向的前端,怎么能不搞搞全棧呢。。。地址歡迎大家多多交流前端技術(shù)啊,如果大家喜歡的話,請給我一個小小的哦 作為一個有志向的前端,怎么能不搞搞全(zhuang)棧(bi)呢。。。說搞咱就搞啊,后端就用node,數(shù)據(jù)庫就用mongodb,前端呢,呃,再搞個node的web框架express,思路搞定,開始搭建我們的環(huán)境,搭建之前還是先看看我們的目標和成果 項目的目標和成果 sh...
摘要:調(diào)用函數(shù)執(zhí)行下一個中間件函數(shù)。然后,該中間件調(diào)用函數(shù)檢查文件是否存在。為了代碼更加清晰,你也可以將代碼改寫為另外,這里在調(diào)用函數(shù)是使用的是作為輸出選項。事實上,中間件有兩種類型。 原生 Node 的單一請求處理函數(shù),隨著功能的擴張勢必會變的越來越難以維護。而 Express 框架則可以通過中間件的方式按照模塊和功能對處理函數(shù)進行切割處理。這樣拆分后的模塊不僅邏輯清晰,更重要的是對后期維...
閱讀 2913·2023-04-26 00:26
閱讀 3517·2023-04-25 14:30
閱讀 3407·2021-10-09 09:44
閱讀 3699·2021-09-28 09:35
閱讀 1893·2021-09-22 16:02
閱讀 1282·2021-09-03 10:30
閱讀 3243·2019-08-30 15:53
閱讀 2183·2019-08-30 14:07