nodejs学习笔记6--connect

本文详细介绍了Node.js中的Connect框架及其HTTP中间件的使用,包括如何构建自定义中间件、处理异步操作、实现路由、使用内置中间件如解析查询字符串和请求主体,以及设置会话管理。通过实例展示了中间件的工作原理和流程,帮助读者深入理解Node.js的中间件机制。
摘要由CSDN通过智能技术生成

构建和使用http中间件

http中间件的作用:对请求-响应循环进行了包装,在到达应用程序代码之前扩展请求对象或者在响应前后进行修改。

ConnectHttp中间件框架

Node的Connect框架对中间件组件定义了一个模型,还定义了一个引擎来运行中间件组件。实际上Express框架实际上是依赖Connect创建而成的。优点:
* 模型简单
* 中间件易于组合和插拔
* 中间件易于定制和优化
* 丰富的中间件

构建自定义HTTP中间件

中间件只是一个接受请求和响应对象的函数。下面展示一个简单的示例。先安装connect模块:

npm install connect

创建一个helloworld.js文件:

function helloworld(req,res){
    res.end('hello world');
};
module.exports = helloworld;;

创建connect服务器测试中间件

var connect = require('connect');
var http = require('http');
var helloworld = require('./helloworld');
var app = connect();
app.use(helloworld);
http.createServer(app).listen(8080);

创建异步中间件

中间件函数是可以异步的,当工作结束时,调用一个回调函数,以便让引擎继续工作。示例:创建一个中间件组件,将头部数据引入响应头中。

function writeHeader(name,value){
    return function(req,res,next){
        res.writeHeader(name,value);
        next();
    };
}
module.exports = writeHeader;

将这个中间件包含到传入服务器构造函数的中间件堆栈中:

var connect = require('connect');
var helloworld = require('./helloworld');
var writeHeader = require('./writeHeader');
var app = connect();
app.use(writeHeader('haha',"hha"));
app.use(helloworld);
app.listen(8080);

启动后访问就可看到响应头中多了个haha而且输出helloworld.

中间件最朴素的原型:

function(req,res,next){
    ....
}

三个参数分别代表请求对象、响应对象、下一个中间件。如果当前中间件调用了res.end()结束了响应,执行下一个中间件就没有意义了。
中间件的流式处理:

var app = connect();
// Middleware
app.use(connect.staticCache());
app.use(connect.static(__dirname + '/public'));
app.use(connect.cookieParser());
app.use(connect.session());
app.use(connect.query());
app.use(connect.bodyParser());
app.use(connect.csrf());
app.use(function (req, res, next) {
  // 中间件
});
app.listen(8080);

Conncet提供use方法用于注册中间件到一个Connect对象的队列中,此队列叫做中间件队列。
在请求来临的时候,依次调用队列中的中间件,直到某个中间件不再调用下一个中间件为止。
必须要有一个中间件调用res.end()方法来告知客户端请求已被处理完成,否则客户端将一直处于等待状态。

路由

app.use()方法接受两个参数,路由信息和中间件函数。路由的作用是过滤不匹配的URL。请求在遇见路由信息不匹配时,直接传递给下一个中间件处理。如果没有传路由则表示所有的请求都会被该中间件处理。
考虑到的一个性能问题是中间队列太长会降低性能。文件上传中间件:

app.use('/upload',connect.multipart({uploadDir:path}));

使用捆绑在Connect中的HTTP中间件

记录请求:

var connect = require('connect');
var app = connect();
app.use(connect.logger());
app.use(function(req,res){
    res.end('helloworld');
});
app.listen(8080);

还可以指定输出日志格式:

app.use(connect.logger('tiny'));
//或者只输出HTTP方法,URI,状态码和响应时间
var format = ':method:url-:status-:response-time ms';
app.use(connect.logger(format));

处理错误:

app.use(function(req,res,next){
    next(new Error('hey'));
});
app.use(connect.errorHandler());

提交静态文件:

app.use(connect.static(_dirname+'/public'));
app.use(function(req,res){
    res.end('hello world');
});
app.listen(8080);

静态文件服务器会在public目录中查找文件,如果找到,文件就会被提交,中间件链也会被中断。启动后访问localhost:8080/pic.jpg。public目录下如果有则浏览器会呈现图像。

解析查询字符串

将查询字符串设置到请求上,以便下一个中间件可以使用。

app.use(connect.query());
app.use(function(req,res){
    res.end(JSON.stringify(req.query));
});

解析请求主体

请求主体解析中间件在请求对象上提供了一个body属性,而且能够识别内容类型并对其正确的解码。例如appliction/json类型。

app.use(connect.bodyParser());
ap.use(funcition(req,res){
    res.end(JSON.stringify(req.body));
});
app.listen(8080);

解析cookies

app.use(connect.cookieParser());
app.use(function(req,res){
    res.end(JSON.stringify(req.cookies));
});

使用会话

会话默认使用内存储存器,实际应用应该使用外部持久存储器。

var format = require('util').format;
app.use(connect.query());
app.use(connect.cookieParser('加密字符串'));
app.use(connect.session({
    cookie:{maxAge:24*60*60*1000}
}));
app.use(function(req,res){
    for(var name in req.query){
        req.session[name] = req.query[name];
    }
    res.end(format(req.session));
});

还有很多其他可用的中间件。可以到connect的github主页去看。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值