《node.js实战》第六章 connect中间件

本文深入探讨了Connect框架的基本概念与工作原理,包括中间件的使用、响应处理及错误管理等内容,并展示了如何通过具体实例来实现认证及管理面板等功能。

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');
    }
  }
}

 

 如果路由中间件抛出了错误,中间件都会跳过。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值