NodeJS入门 0xC Node的Web开发 深入了解Connect

创建 Connect 程序

$ npm install connect@3.4.0
//server.js
const app = require('connect')();
app.use((req,res,next)=>{
    res.end('Hello ,Connect!');
});
app.listen(3000);

了解 Connect 中间件的工作机制

    Connect 中间件就是 JavaScript 函数。这个函数一般会有三个参数:请求对象、响应对象,以及一个名为 next 的回调函数。一个中间件完成自己的工作,要执行后续的中间件时,可以调用这个回调函数。

    在中间件运行之前, Connect 会用分派器接管请求对象,然后交给程序中的第一个中间件。下图图是一个典型的 Connect 程序的示意图,由分派器和一组中间件组成,这些中间件包括日志记录、消息体解析器、静态文件服务器和定制中间件。

 组合中间件

const connect = require('connect');
function logger(req,res,next){
    console.log('%s %s',req.method,req.url);
    next();
}
function hello(req,res){
    res.setHeader('Content-Type','text/plain');
    res.end('hello connect');
}
connect()
    .use(logger)
    .use(hello)
    .listen(3000);

中间件的顺序

     中间件的顺序会对程序的行为产生显著影响。漏掉 next()能停止执行,也可以通过组合中间件实现用户认证之类的功能。

 创建可配置的中间件

    为了做到可配置,中间件一般会遵循一个简单的惯例:用一个函数返回另一个函数(闭包)。

function setup(options) {
    // 设置逻辑
    //在这里做中间件的初始化
    return function(req, res, next) {
        // 中间件逻辑
        //即使被外部函数返回了,仍可以访问options
    }
}
//用法
app.use(setup({some:'options'}));

     在实际工作中,可配置的中间件跟之前创建的不可配置中间件用起来是一样的,只是可以向其中传入额外的参数来改变它的行为。可配置中间件的使用和下面这个例子差不多, logger 能接收一个字符串参数,描述输出的日志格式:

const app = connect()
.use(logger(':method :url'))
.use(hello);

    为了让 logger 可配置,需要先定义一个 setup 函数,它能接受一个字符串参数(此例中名为 format)。 setup 的返回结果是一个函数,即 Connect 所用的中间件。即便被 setup 返回后,这个中间件函数仍能访问 format,因为它们是在同一个 JavaScript 闭包内定义的。 logger会将 format 中的标记替换为 req 对象中的相应属性,输出到控制台,然后调用 next()。

function setup(format) {//setup 函数可以用不同的配置调用多次
    const regexp = /:(\w+)/g;//logger 组件用正则表达式匹配请求属性
    
    return function createLogger(req, res, next) {
        //Connect 使用的真实 logger 组件
        const str = format.replace(regexp, (match, property) => {
            return req[property];//用正则表达式格式化请求的日志条目
        });
        console.log(str);//将日志条目输出到控制台
        next();//将控制权交给下一个中间件组件
    }
}
module.exports = setup;//直接导出logger的setup函数

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值