構(gòu)建 Node Web ToDoList 程序
本文是《Node.js 實(shí)戰(zhàn)》讀書筆記。
node 中 HTTP請(qǐng)求生命周期
- HTTP客戶端,發(fā)起HTTP請(qǐng)求
- Node 接受連接龟劲,以及發(fā)送給HTTP服務(wù)器的請(qǐng)求數(shù)據(jù)
- HTTP 服務(wù)器解析完成HTTP頭荞怒,將控制權(quán)轉(zhuǎn)交給請(qǐng)求回調(diào)函數(shù)
- 請(qǐng)求回調(diào),執(zhí)行業(yè)務(wù)邏輯
- 響應(yīng)通過HTTP服務(wù)器送回去拼余。由它為客戶端構(gòu)造格式正確的HTTP響應(yīng)
Hello world 示例:
var http = require('http');
var Server = http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
});
Server.listen(3000);
console.log("服務(wù)器運(yùn)行在:http://localhost:3000");
讀取設(shè)置響應(yīng)頭
方法:
- res.setHeader(field, value)
- res.getHeader(field)
- res.removeHeader(field)
設(shè)置狀態(tài)碼
方法:
res.statusCode = 200
構(gòu)建RESTful Web服務(wù)
使用POST亩歹、GET匙监、DELETE、PUT
實(shí)現(xiàn)一個(gè)命令行的TODOLIST
var http = require('http');
var url = require('url');
var items = [];
var server = http.createServer(function (req, res) {
switch (req.method) {
case 'POST':
var item = '';
req.setEncoding('utf8');
req.on('data', function (chunk) {
item += chunk
});
req.on('data', function () {
items.push(item);
res.end('OK\n');
});
break;
case 'GET':
var body = items.map(function (item, i) {
return i + ')' + item;
}).join('\n');
res.setHeader('Content-Length', Buffer.byteLength(body));
res.setHeader('Content-type', 'text/plain;charset="utf-8"');
res.end(body);
case 'DELETE':
// parse parsename 獲取"localhost:3000/1?api-key=footbar"中的"1"
var path = url.parse(req.url).pathname;
var i = parseInt(path.slice(1), 10);
//判斷是否是數(shù)字
if (isNaN(i)) {
res.statusCode = 400;
res.end('Invalid item id');
// 判斷元素是否存在
} else if (!items[i]) {
res.statusCode = 404;
res.end('Item not found');
} else {
// splice 刪除指定元素小作,并改變?cè)袛?shù)組
items.splice(i, 1);
res.end('OK\n');
}
}
});
server.listen(3000);
Node 對(duì)url的解析提供了.parse()函數(shù)亭姥。
require('url').parse('http://localhost:3000/1?api-key=footbar')
URL{
protocol: 'http:',
slashes: true,
auth: null,
host: 'localhost:3000',
port: '3000',
hostname: 'localhost',
hash: null,
search: '?api-key=footbar',
query: 'api-key=footbar',
pathname: '/1',
path: '/1?api-key=footbar',
href: 'http://localhost:3000/1?api-key=footbar'
}