Node.js 實戰(zhàn) (第二部分)

4. 構(gòu)建Node Web程序

1.HTTP服務(wù)器的基本知識

呈現(xiàn)一個HTTP請求

var http = require("http");

var server = http.createServer(function(req, res) {
  // 讀取請求頭 以及 設(shè)置響應(yīng)頭
  var body = "cool!";
  res.setHeader("Content-Length", body.length);
  res.setHeader("Content-Type", "text/plain");

  // 設(shè)置狀態(tài)碼
  res.statusCode = 302;
  // 處理請求
  // res.write(body)
  // res.end();

  res.end(body);
});

server.listen(3000);
  • 添加和移除響應(yīng)頭的順序可以隨意皆怕,但一定要在調(diào)用res.write()或 res.end()之前毅舆。
  • 在響應(yīng)主體的第一部分寫入之后,Node會刷新已經(jīng)設(shè)定好的HTTP頭愈腾。

2. 構(gòu)建RESTful Web服務(wù)

1. 用POST請求創(chuàng)建資源

var http = require("http");

var server = http.createServer(function(req, res) {

  // 設(shè)置utf8后, 下面data就會給出字符串,而不是對象
  req.setEncoding('utf8')

  // 讀取請求頭 以及 設(shè)置響應(yīng)頭
  req.on("data", function(chunk) {
    console.log("parsed" + chunk);
  });
  req.on("end", function() {
    console.log("done parsing");
    res.end();
  });
});

server.listen(3000);

5. 存儲Node程序中的數(shù)據(jù)

1. 無服務(wù)的數(shù)據(jù)存儲

  • 內(nèi)存存儲
    • 弊端: 不能持久化
  • 基于文件的存儲
    • 弊端: 單文件并發(fā)有問題.

2. 關(guān)系型數(shù)據(jù)庫管理系統(tǒng)

關(guān)系型數(shù)據(jù)庫,查詢起來很容易, 開源軟件也可以不花錢

  • MySQL
  • PostgreSQL
    • 輕量目錄訪問協(xié)議
    • 通過安全服務(wù)應(yīng)用程序接口
    • 同步復制: 在每次數(shù)據(jù)操作后對復制進行驗證,從而防止數(shù)據(jù)丟失
    • npm install pg

3. NoSQL數(shù)據(jù)庫

含義是 No SQL 或者 Not only SQL

  • Redis
    • 適合處理不需要長期訪問的數(shù)據(jù)存儲
    • 數(shù)據(jù)存儲于 RAM 中
    • 數(shù)據(jù)存儲有限, 但數(shù)據(jù)操作非潮锘睿快
    • npm install redis
  • MongoDB
    • 通用的 非關(guān)系型 數(shù)據(jù)庫,
    • npm install mongodb
  • Mongoose
    • 其可以順暢地使用MongoDB
    • 提供了一些實用的功能

6. Connect

其是一個框架, 使用中間件的模塊化組件.

1. 搭建一個Connect程序

  • 第三方模塊需要安裝. npm install connect
var connect = require('connect');
var app = connect();
app.listen(3000);

2. 工作機制

  • 其中間件概念受到Ruby的Rack框架的啟發(fā).
    • 小巧
    • 自包含
    • 可以在整個程序中重用
  • next() 在中間件里調(diào)用, 用回調(diào)函數(shù),而不是從方法中返回, 是為了可以在中間件組件里運行異步邏輯.
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);

3. 中間件的順序很重要

如果前一個中間件,不調(diào)用next(), 命令鏈中的后續(xù)中間件都不會被調(diào)用.

4. 掛載中間件和服務(wù)器

可以根據(jù)掛載的路徑前綴.選擇性的調(diào)用中間件

var connect = require("connect");

connect()
  .use(logger)
  .use('/admin',restrice)
  .use('/admin',admin)
  .use(hello)
  .listen(3000);
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;
  }
}

5. 創(chuàng)建可配置中間件

利用閉包, 返回可以配置的中間件

function setup(options) {
  // 設(shè)置邏輯
  
  return function (req, res, next) {
    // 中間件邏輯
  } 
}
app.use(setup({some:'options'}))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市虱黄,隨后出現(xiàn)的幾起案子悦即,更是在濱河造成了極大的恐慌,老刑警劉巖橱乱,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辜梳,死亡現(xiàn)場離奇詭異,居然都是意外死亡泳叠,警方通過查閱死者的電腦和手機作瞄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來危纫,“玉大人宗挥,你說我怎么就攤上這事乌庶。” “怎么了契耿?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵瞒大,是天一觀的道長。 經(jīng)常有香客問我搪桂,道長透敌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任踢械,我火速辦了婚禮酗电,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘裸燎。我一直安慰自己顾瞻,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布德绿。 她就那樣靜靜地躺著荷荤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪移稳。 梳的紋絲不亂的頭發(fā)上蕴纳,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音个粱,去河邊找鬼古毛。 笑死,一個胖子當著我的面吹牛都许,可吹牛的內(nèi)容都是我干的稻薇。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼胶征,長吁一口氣:“原來是場噩夢啊……” “哼塞椎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起睛低,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤案狠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后钱雷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骂铁,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年罩抗,在試婚紗的時候發(fā)現(xiàn)自己被綠了拉庵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡套蒂,死狀恐怖名段,靈堂內(nèi)的尸體忽然破棺而出阱扬,到底是詐尸還是另有隱情泣懊,我是刑警寧澤伸辟,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站馍刮,受9級特大地震影響信夫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卡啰,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一静稻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匈辱,春花似錦振湾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浅碾,卻和暖如春大州,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背垂谢。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工厦画, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人滥朱。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓根暑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親徙邻。 傳聞我的和親對象是個殘疾皇子排嫌,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,898評論 2 89
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)鹃栽,斷路器躏率,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 概要 64學時 3.5學分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,095評論 0 3
  • 下午難得半日閑,做一次小小整理民鼓。 臥室的衣柜塞得滿滿當當薇芝,豎掛著,橫疊著丰嘉,扒拉出來夯到,一件一件撿翻,絕大多數(shù)衣服二饮亏、...
    如如在閱讀 209評論 0 0
  • 今天 玩的很開心的一天耍贾。 早上睡到八點多自然醒阅爽,玩手機到十點等他考完試就起床洗漱,化妝荐开,換衣服出門付翁。 今天打卡了微...
    愛兔幾的小仙仙閱讀 208評論 0 0