您的位置:首页 > Web前端 > Node.js

nodejs中间件Connect(1)

2014-10-23 16:11 337 查看

1.实现简单网站服务

首先请参考我的另一篇文章《一个用nodejs写的简单http服务器》,然后我们现在用一个在nodejs中使用频繁的中间件。首先我们使用这个中间件实现相同的功能。

首先需要修改下JSON配置文件,如下:{
"name":"file-explorer"
,"version":"0.0.1"
,"description":"A command-file file explorer"
,"dependencies":{
"connect":"1.8.7"
}
} 然后运行npm install,就加载了connect中间件。
然后是server代码,具体如下:

var connect = require('connect');
var server = connect.createServer();

server.use(connect.static(__dirname + '/website'));
server.listen(3000);
将index文件和4张图片资源放到server.js所在目录的/wetsite目录下,输入网址: 127.0.0.1:3000,就OK了,代码减少了很多,可见中间件帮助我们实现了那些常用的功能,包括url=='/',not found的情况等等。

2.实现一个记录响应延时的功能

在工程目录中新建一个文件叫做request-time.js,内容如下:

module.exports = function (opts){
var time = opts.time || 100;
return function(req,res,next){
var timer = setTimeout(function(){
console.log(
'\033[90m%s\033[39m\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(timer);
};
next();
};
};
 导出一个函数,这个函数可以设置一个响应时间的阈值,如果响应时间超过这个阈值,则打印日志,(timer的回调函数实现)。否则就要在响应结束,也就是res.end调
用的时候清除imer定时器。这里是将res.end保存在var end中,然后设置res.end为一个自定义的函数,该函数,设置回默认的end函数,然后先调用默认的end,然后清楚

timer定时器。这个清除定时器的工作其实只要调用end都会执行,只是如果在定时器时间到之前清除,就不会打印日志而已。

导出的这个函数,返回一个函数,这个函数是一个标准的中间件函数的格式,req,是请求数据,res,是response,返回数据,next,是用来调用下一个中间件的。所有的中间件形成一个类似链表的玩意,然后顺次查询,我的理解大概是这样的,虽然效率不是很高,但是简单易行。

然后在server.js中调用该中间件,如下:

var connect = require('connect');
var time = require('./request-time');

var server = connect.createServer();

//server.use(connect.static(__dirname + '/website'));
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);
user 就是用来添加中间件的,也就是添加一个具有固定参数格式的函数。然后输入网址进行测试:

输入http://127.0.0.1:3000/b,和http://127.0.0.1:3000/a,服务器终端输出如下:



有红色字体的部分是超时回调函数打印的,绿色的部分是server.use(connect.logger('dev'));的作用。

参考书目:《了不起的NodeJS》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  nodejs