node工具--connect

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

  • 建立package.json:
    {
    	"name": "my-website",
    	"version": "0.0.1",
    	"dependencies": {
    		"connect": "1.8.7"
    	},
    	"description": "an connect website"
    }
  • 安裝依賴:npm install;
  • 代碼例子:
    //用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);
  • static中間件:
    • 掛載:將任意一個URL匹配到文件系統中任意一個目錄
      server.use('/my-images', connect.static(__dirname + '/website/img'));
    • maxAge:設置一個資源客戶端緩存的時間
      server.use('/js', connect.static(__dirname, {maxAge:10000}));
    • hidden:設置爲true的話,connect也會託管文件系統中的隱藏文件
      server.use(connect.static(__dirname, {hidden:true}));
  • query中間件:獲取查詢字符串  //query中間件在express中默認是啓用的;
    server.use(connect.query())
    server.use(function (req, res) {
        console.log(req.query.name);	   //req.query對象格式返回,如訪問xxx?name = jinks;返回{name:'jinks'}
    })
  • logger中間件:診斷工具;將發送進來的請求信息和發送出去的響應信息打印在終端
    • server.use(connect.logger('dev'));

      

    • server.use(connect.logger('default'));

      

    • server.use(connect.logger('short'));

      

    • server.use(connect.logger('tiny'));

      

    • server.use(connect.logger(':method :remote-addr'  :res[Content-Length]));  //自定義格式輸出; 查看完整的token
  • bodyParser中間層:
    • 與http模塊中使用qs模塊解析post請求消息體同樣,bodyParser中間層也具備這樣功能;
      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);
  • cookieParser中間件; //讀寫cookie數據
    server.use(connect.cookieParser());
    
    server.use(function(req, res ,next) {
    	//req.cookies  //對象形式返回
    });
    
  • session中間件;web

    • 出於安全考慮,在初始化session中間件的時候須要提供secret選項
      connect.session({secret: 'my app secret'})
    • 使用req.sesstion記錄數據:    req.session.logged_in; req.session.name

建立會話: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);
相關文章
相關標籤/搜索