HTTP構建一個網站:javascript
var http = require('http'); var fs = require('fs'); var server = http.createServer(function(req, res) { if('GET' === req.method && '/img' === req.url.substr(0,4) && '.jpg' === req.url.substr(-4)) { fs.stat(__dirname + req.url, function(err, stat) { //檢查文件是否存在 if(err || !stat.isFile()) { res.writeHead(404); res.end('Not Found'); return; } serve(__dirname + req.url, 'image/png'); //'application/jpg':會下載圖片 }); } else if('GET' === req.method && '/' === req.url) { serve(__dirname + '/index.html','text/html'); } else { res.writeHead(400); res.end('Not Found'); } function serve(path, type) { res.writeHead(200, {'Content-Type': type}); fs.createReadStream(path).pipe(res); //將文件系統流接到HTTP響應流中; } }); server.listen(3000);
經過connect實現一個網站:html
{ "name": "my-website", "version": "0.0.1", "dependencies": { "connect": "1.8.7" }, "description": "an connect website" }
//用connect修改http構建的網站;
var connect = require('connect'); var server = connect.createServer(); //能夠簡化 server = connect(); server.use(function(req, res, next) { console.log(' %s: %s ', req.method, req.url); next(); //下一個中間件; }); server.use(function(req, res, next) { if('GET' === req.method && '/img' === req.url.substr(0,4)) { console.log('img'); } else { next(); } }); server.use(function(req, res, next) { if('GET' === req.method && '/' === req.url) { console.log('index'); } else { console.log('other'); next(); } }); server.use(function(req, res, next) { res.writeHead(404); res.end('Not Found'); }); server.listen(3000);
中間件://中間件由函數組成,它除了處理req,res對象外還接受 一個next函數作流控制;java
//sample.js /* 請求超時 */ module.exports = function(opts) { var time = opts.time || 100; return function(req, res, next) { console.log(1); var timer = setTimeout(function() { console.log('\033[90m%s %s\033[91mis taking too long!\033[39m', req.method, req.url); }, time); var end = res.end; res.end = function(chunk, encoding) { res.end = end; res.end(chunk, encoding); clearTimeout(); } next(); } }
//main.js var connect = require('connect'); var time = require('./3.2'); var server = connect.createServer(); /* 記錄請求狀況 */ server.use(connect.logger('dev')); /* 實現時間中間件 */ server.use(time({time: 500})); /* 快速響應 */ server.use(function(req, res, next) { if('/a' === req.url) { res.writeHead(200); res.end('Fast!'); } else { next(); } }); /* 慢速響應 */ server.use(function(req, res, next) { if('/b' === req.url) { setTimeout(function() { res.writeHead(200); res.end('slow'); }, 1000); } else { next(); } }); server.listen(3000);
server.use('/my-images', connect.static(__dirname + '/website/img'));
server.use('/js', connect.static(__dirname, {maxAge:10000}));
server.use(connect.static(__dirname, {hidden:true}));
server.use(connect.query()) server.use(function (req, res) { console.log(req.query.name); //req.query對象格式返回,如訪問xxx?name = jinks;返回{name:'jinks'} })
server.use(connect.bodyParser()); server.use(function(req, res, next) { //req.body; }
var connect = require('connect'); var fs = require('fs'); var server = connect(connect.logger('dev'),connect.static('static'),connect.bodyParser()); //簡化加載中間件
//設置默認url:'/'爲文件系統中static文件夾,若是有Index.html,就加載此項; server.use(function(req, res, next) { if('POST' === req.method ) { fs.readFile(req.files.files.path, 'utf8', function(err, data) { if(err) { res.writeHead(500); res.end('Error!'); return; } res.writeHead(200, {'Content-Type': 'text/html'}); res.end([ '<h3>File: ' + req.files.files.name + '</h3>', '<h4>Type: ' + req.files.files.type + '</h4>', '<h1>Contents:</h4><pre>' + data + '</pre>' ].join('')); }); } else { next(); } }) server.listen(3000);
server.use(connect.cookieParser()); server.use(function(req, res ,next) { //req.cookies //對象形式返回 });
session中間件;web
connect.session({secret: 'my app secret'})
建立會話:express
--------------users.json---------------------------------- //當只要對外暴露數據時,不須要module.exports而直接把數據文件以JSON形式暴露出來 { "jinks": { "password" : "ferret", "name": "jinks" } } --------------app.js------------------------------------ var connect = require('connect'); var users = require('./users'); var server = connect( connect.logger('dev'), connect.bodyParser(), connect.cookieParser(), connect.session({secret: 'my app secret'}), function(req, res, next) { console.log(req.session.logged_in); if('/' === req.url && req.session.logged_in) { res.writeHead(200, {'Content-Type': 'text/html'}); res.end('welcome back, <b>' + req.session.name + '</b>. ' + '<a href="/logout">Logout</a>'); } else { next(); } }, function(req, res, next) { if('/' === req.url && 'GET' === req.method) { res.writeHead(200, {'Content-Type': 'text/html'}); res.end([ '<form action="/login" method="post"' +'<fieldset>' +'<legend>Please log in</legend>' +'<p>User: <input type="text" name="user"/></p>' +'<p>Password: <input type="password" name="password"/></p>' +'<button>Submit</button>' +'</fieldset>' +'</form>'].join('')); } else { next(); } }, function(req, res, next) { if('/login' === req.url && 'POST' === req.method) { res.writeHead(200); if(!users[req.body.user] || req.body.password != users[req.body.user].password) { res.end('Bad username/password'); } else { req.session.logged_in = true; req.session.name = users[req.body.user].name; res.end('Authenticated!'); } } else { next(); } }, function(req, res, next) { if('/logout' === req.url) { req.session.logged_in = false; res.writeHead(200); res.end('Logged out!'); } else { next(); } }); server.listen(3000);