摘要:使用了一個事件驅(qū)動非阻塞式的模型,使其輕量又高效。依賴就近,延遲執(zhí)行。使用錯誤處理中間件默認(rèn)情況下,給出的響應(yīng)是狀態(tài)碼,包含文本以及錯誤自身詳細(xì)信息的響應(yīng)主體。
Node.js是什么
官網(wǎng)定義:
Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環(huán)境。 Node.js 使用了一個事件驅(qū)動、非阻塞式I/O 的模型,使其輕量又高效。
非阻塞 I/O 模型(non-blocking I/O model),簡單點講就是每個函數(shù)都是異步的,最后由 Libuv 這個 C/C++ 編寫的事件循環(huán)處理庫來處理這些 I/O 操作,隱藏了非阻塞 I/O 的具體細(xì)節(jié),簡化并發(fā)編程模型,讓你可以輕松的編寫高性能的Web應(yīng)用,所以它是輕量(lightweight)且高效(efficient)的。
Node.js能做什么1)跨平臺:覆蓋你能想到的面向用戶的所有平臺,傳統(tǒng)的PC Web端,以及PC客戶端 nw.js/electron 、移動端 cordova、HTML5、react-native、weex,硬件 ruff.io 等
2)Web應(yīng)用開發(fā):網(wǎng)站、Api、RPC服務(wù)等
3)前端:三大框架 React Vue Angular 輔助開發(fā),以及工程化演進(jìn)過程(使用Gulp /Webpack 構(gòu)建 Web 開發(fā)工具)
4)工具:npm上各種工具模塊,包括各種前端預(yù)編譯、構(gòu)建工具 Grunt / Gulp、腳手架,命令行工具,各種奇技淫巧等
其實,一般使用是不需要掌握上圖中的所有技術(shù)的。對于初學(xué)者來說,先夠用,再去深究細(xì)節(jié)。所以,精簡一下,只了解3個就足夠足夠用了。
Promise 的最大優(yōu)勢是標(biāo)準(zhǔn)化,各類異步工具庫都按照統(tǒng)一規(guī)范實現(xiàn),即使是async函數(shù)也可以無縫集成。所以用 Promise 封裝 API 通用性強,用起來簡單,學(xué)習(xí)成本低。在async函數(shù)普及之前,絕大部分應(yīng)用都是采用Promise來做異步流程控制的,所以掌握Promise是Node.js學(xué)習(xí)過程中必須要掌握的重中之重。
推薦學(xué)習(xí)資料
Node.js最新技術(shù)棧之Promise篇 https://cnodejs.org/topic/560...
理解 Promise 的工作原理 https://cnodejs.org/topic/569...
Promise 迷你書 http://liubin.github.io/promi...
瀏覽器中非阻塞I/O的例子
Node中的非阻塞I/O示例
CommonJS
通過 require 來加載模塊。
通過 exports 和 modul.exports 來暴露模塊中的內(nèi)容。
// moduleA.js module.exports = function( value ){ return value * 2; // moduleB.js var multiplyBy2 = require("./moduleA"); var result = multiplyBy2(4);
CommonJS是同步加載模塊,服務(wù)器端的Node.js遵循CommonJS規(guī)范。
require("module"); require("../file.js"); exports.doStuff = function() {}; module.exports = someValue;
AMD
AMD是"Asynchronous Module Definition"的縮寫,意思就是"異步模塊定義"。AMD規(guī)范其實只有一個主要接口 define(id,dependencies,factory),它要在聲明模塊的時候指定所有的依賴dependencies,并且還要當(dāng)做形參傳到factory中,對于依賴的模塊提前執(zhí)行,依賴前置。
define("module", ["dep1", "dep2"], function(d1, d2) { return someExportedValue; }); require(["module", "../file"], function(module, file) { /* ... */ });
CMD
CMD規(guī)范和AMD相似,盡量保持簡單,并且與CommonJS和NodeJS的Modules規(guī)范保持了很大的兼容性。依賴就近,延遲執(zhí)行。
define(function(require, exports, module) { var $ = require("jquery"); var Spinning = require("./spinning"); exports.doSomething = ... module.exports = ... })Node查找模塊的步驟 中間件
中間件組件是一個JavaScript函數(shù),按慣例會接受三個參數(shù):一個請求對象, 一個響應(yīng)對象,還有一個通常命名為next的參數(shù),它是一個回調(diào)函數(shù),表明這個組件已經(jīng)完成了它的工作,可以執(zhí)行下一個中間件組件了。
Connect
最小的Connect程序
var connect = require("connect"); var app = connect(); app.listen(3000);
日志中間件
var connect = require("connect"); function logger(req, res, next) { console.log("%s %s", req.method, req.url); next(); } function hello(req, res) { res.setHeader("Content-Type", "text/plain"); res.end("hello world"); } connect() .use(logger) .use(hello) .listen(3000);
中間件的順序很重要
用中間件的順序執(zhí)行認(rèn)證
var connect = require("connect"); connect() .use(logger) .use(restrictFileAccess) .use(serveStaticFiles) .use(hello) .listen(3000);
掛載中間件和服務(wù)器
路由admin請求
function admin(req, res, next) { switch (req.url) { case "/": res.end("try /users"); break; case "/users": res.setHeader("Content-Type", "application/json"); res.end(JSON.stringify(["tobi", "loki", "jane"])); break; } }
掛載中間件或服務(wù)器
var connect = require("connect"); connect() .use(logger) .use("/admin", restrict) .use("/admin", admin) .use(hello) .listen(3000);
創(chuàng)建可配置中間件
function setup(options) { // 設(shè)置邏輯 return function(req, res, next) { // 中間件邏輯 } } app.use(setup({some: "options"}));
創(chuàng)建可配置的logger中間件組件
var app = connect() .use(logger(":method :url")) .use(hello);
構(gòu)建路由中間件組件
var connect = require("connect"); var router = require("./middleware/router"); var routes = { GET: { "/users": function(req, res) { res.end("tobi, loki, ferret"); }, "/user/:id": function(req, res, id) { res.end("user " + id); } }, DELETE: { "/user/:id": function(req, res, id) { res.end("deleted user " + id); } } }; connect() .use(router(routes)) .listen(3000);
因為程序里中間件的數(shù)量沒有限制,中間件組件使用的次數(shù)也沒有限制,所以在一個程序中 有可能會定義幾個路由器。
var connect = require("connect"); var router = require("./middleware/router"); connect() .use(router(require("./routes/user"))) .use(router(require("./routes/admin"))) .listen(3000);
使用錯誤處理中間件
var connect = require("connect") connect() .use(function hello(req, res) { foo(); res.setHeader("Content-Type", "text/plain"); res.end("hello world"); }) .listen(3000);
默認(rèn)情況下,Connect給出的響應(yīng)是狀態(tài)碼500,包含文本“Internal Server Error”以及錯誤自 身詳細(xì)信息的響應(yīng)主體。
function errorHandler() { var env = process.env.NODE_ENV || "development"; return function(err, req, res, next) { res.statusCode = 500; switch (env) { case "development": res.setHeader("Content-Type", "application/json"); res.end(JSON.stringify(err)); break; default: res.end("Server error); } } }
Connect自帶的中間件
cookieParser(): 解析HTTP cookie
bodyParser(): 解析請求主體
limit(): 請求主體的限制
query(): 查詢字符串解析
logger(): 記錄請求
session(): 會話管理
static(): 靜態(tài)文件服務(wù)
數(shù)據(jù)存儲
內(nèi)存, redis, mysql, mongodb, mongoose
渲染視圖
處理表單和文件上傳
阿里云,騰訊云,域名,pm2,nginx,集群,分布式,docker,微服務(wù)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/98781.html
摘要:前端每周清單年度總結(jié)與盤點在過去的八個月中,我?guī)缀踔蛔隽藘杉?,工作與整理前端每周清單。本文末尾我會附上清單線索來源與目前共期清單的地址,感謝每一位閱讀鼓勵過的朋友,希望你們能夠繼續(xù)支持未來的每周清單。 showImg(https://segmentfault.com/img/remote/1460000010890043); 前端每周清單年度總結(jié)與盤點 在過去的八個月中,我?guī)缀踔蛔隽?..
摘要:利用中間件實現(xiàn)異步請求,實現(xiàn)兩個用戶角色實時通信。目前還未深入了解的一些概念。往后會寫更多的前后臺聯(lián)通的項目。刪除分組會連同組內(nèi)的所有圖片一起刪除。算是對自己上次用寫后臺的一個強化,項目文章在這里。后來一直沒動,前些日子才把后續(xù)的完善。 歡迎訪問我的個人網(wǎng)站:http://www.neroht.com/? 剛學(xué)vue和react時,利用業(yè)余時間寫的關(guān)于這兩個框架的訓(xùn)練,都相對簡單,有的...
摘要:月號,杭州和聯(lián)合主辦的第八期技術(shù)分享會,在公司如期舉行。張偉林,宋小菜資深前端開發(fā)工程師,年,霹靂迷,已手殘的紙牌魔術(shù)師,喜歡神奇的東西,技術(shù)棧從上向下不斷橫向縱向貫穿,目前在尋找前后端大一統(tǒng)思想的路上越走越偏。 showImg(https://segmentfault.com/img/bVbkWN4?w=3000&h=1686); 12 月 9 號,杭州 NodeParty 和 Ro...
摘要:異步最佳實踐避免回調(diào)地獄前端掘金本文涵蓋了處理異步操作的一些工具和技術(shù)和異步函數(shù)。 Nodejs 連接各種數(shù)據(jù)庫集合例子 - 后端 - 掘金Cassandra Module: cassandra-driver Installation ... 編寫 Node.js Rest API 的 10 個最佳實踐 - 前端 - 掘金全文共 6953 字,讀完需 8 分鐘,速讀需 2 分鐘。翻譯自...
摘要:前言一直混跡社區(qū)突然發(fā)現(xiàn)自己收藏了不少好文但是管理起來有點混亂所以將前端主流技術(shù)做了一個書簽整理不求最多最全但求最實用。 前言 一直混跡社區(qū),突然發(fā)現(xiàn)自己收藏了不少好文但是管理起來有點混亂; 所以將前端主流技術(shù)做了一個書簽整理,不求最多最全,但求最實用。 書簽源碼 書簽導(dǎo)入瀏覽器效果截圖showImg(https://segmentfault.com/img/bVbg41b?w=107...
閱讀 3471·2019-08-30 13:15
閱讀 1407·2019-08-29 18:34
閱讀 836·2019-08-29 15:18
閱讀 3494·2019-08-29 11:21
閱讀 3255·2019-08-29 10:55
閱讀 3711·2019-08-26 10:36
閱讀 1877·2019-08-23 18:37
閱讀 1834·2019-08-23 16:57