6.0 connect
connect是一个框架,他被称为中间件的模块化组件。以可重用方式实现web程序中的逻辑。
中间件是一个函数,他拦截http服务器提供的请求,而且可以传递给下一个中间件组件。
6.1 搭建一个connect程序
启动之后,发送一个http请求,会返回 cannot GET/表示他还不能处理URL。
const connect = require('connect');
var app = connect();
app.listen(3000);
6.2 Connect的工作机制
中间件会接收三个参数,request,response,next。
其中next是回调函数,表示这个组件完事了。
6.2.2 响应hello world的中间件
中间件通过next()传递。
function logger(req, res, next) {
console.log(req.method, req.url);
next();
}
function hello(req,res){
res.setHeader('content-type','text/plain');
res.end('hello world');
}
const connect = require('connect');
var app = connect();
app.use(logger);
app.use(hello);
app.listen(3000);
6.4 挂载中间件和服务器
connect有一个挂载的概念,可以给中间件定义一个路径前缀直接访问。
const connect = require('connect');
var app = connect();
app.use('/admin', restrict);
app.use('/admin',admin);
app.listen(3000);
6.4.1 认证中间件
其中使用使用了restrict作为中间的控制。
其中原书使用的new buffer已经废弃,这里使用Buffer.form解码。
const { Buffer } = require('buffer');
const connect = require('connect');
var app = connect();
app.use(logger); //记录器
app.use('/admin', restrict); //校验
app.use('/admin', admin); //页面
function restrict(req, res, next) {
var authorization = req.headers.authorization;
if (!authorization) return next(new Error('un'));
var parts = authorization.split(' ');
var scheme = parts[0];
var auth = Buffer.from(parts[1], 'base64').toString().split(':');
var user = auth[0];
var pass = auth[1];
if (user !== '111' && pass !== '111') {
return
}
next();
}
app.listen(3000);
6.4.2 显示管理面板的中间件
因为connect已经去掉了前缀,所以req.url就可以访问到。
/users则是需要这样访问: http://localhost:3000/admin/users
function admin(req,res,next){
switch(req.url){
case '/':
res.end('try /users');
break;
case '/users':
res.setHeader('content-type','application/json');
res.end(JSON.stringify([1,2,3]))
break;
}
}
6.5 — 5.5.3 创建可配置中间件
由于看不懂正则,暂时略过。。。
6.6 使用错误处理中间件
6.6.1 Connect默认处理错误
下面这个中间件,因为foo没有定义,所以他会抛出错误reference
const app = connect();
app.use((req, res, next) => {
console.log(1);
foo();
next();
});
6.6.2 自行处理程序错误
在connect中,可以自行处理程序错误,比如在错报时发送特定的json。或者响应内部错误,避免暴露敏感信息给攻击者。
错误处理中间件函数必须接收四个参数,err,req,res和next;
注:文中使用了process.env.NODE_ENV,它是我们自己添加上去的一个环境变量,用来确定当前所处的开发阶段。一般生产阶段设为production,开发阶段设为develop,然后在脚本中读取process.env.NODE_ENV。
function errorHandler(){
return function(err,req,res,next){
console.log(3);
var env = process.env.NODE_ENV || 'development';
res.statusCode = 500;
switch(env){
case 'development':
res.setHeader('content-type','application/json');
res.end(JSON.stringify(err));
break;
default:
res.end('server error');
}
}
}
如果路由中间件抛出了错误,中间件都会跳过。
本文深入探讨了Connect框架的基本概念与工作原理,包括中间件的使用、响应处理及错误管理等内容,并展示了如何通过具体实例来实现认证及管理面板等功能。
241

被折叠的 条评论
为什么被折叠?



