Node中的Connect——常用中间件

2023-05-16

接下来介绍一个Connect内置的一些中间件:

static中间件

  1.挂载
  static允许将任意一个URL匹配到文件系统中任意一个目录。如:将/my-images URL和名为/images的目录对应起来,可以以如下方式进行挂载:

server.use('/my-images', connect.static('/path/to/images'));

  2. maxAge
  static中间件接收一个名为maxAge的选项,这个选项代表一个资源在客户端缓存的时间。对于一些不经常改动的资源来说,我们可以进行缓存,浏览器就无需每次都去请求它了。

server.use('/js', connect.static('/path/to/bundles', {maxAge: 1000000000000}));

  比如,一种Web应用常见的实践方式就是将所有的客户端JavaScript文件都合并到一个文件中,并在文件名中加上修订号。这个时候,就可以设置maxAge选项,让其永远缓存起来。如上述代码。
  3. hidden
  static接收的另一参数hidden。当hidden值为true时,Connect会托管那些文件名以点(.)开始的在UNIX文件系统中被认为是隐藏的文件:

server.use(connect.static('/path/to/resources', {hidden: true}));

query中间件

  使用query中间件,能够通过req.query对象自动获取URL中的查询字符串。如:我们请求url /blog?page=5时,我们获取数据查询字符串 page=5,可以这么使用(req.url变量中存储着URL的值,即 /blog?page=5):

server.use(connect.query);
server.use(function(req, res) {
    // req.query.page == "5"
});

logger中间件

  logger中间件将发送进来的请求信息和发送出去的响应信息打印在终端。
  它提供了以下四种日志格式:
  - default
  - dev
  - short
  - tiny
  如:使用dev日志格式,可以通过如下初始化logger中间的方式:

server.use(connect.logger('dev'));

  dev是一种精准简短的日志格式,能够提供行为以及性能方面的信息,方便测试Web应用。
  logger中间还允许自定义日志输出格式,还能通过动态的req和res来记录头信息。
  下面是完整的可用token:
  - :req[header](如:req[accept])
  - :res[header](如:res[content-length])
  - :http-version
  - :response-time
  - :remote-addr
  - :date
  - :method
  - :url
  - :referrer
  - :user-agent
  - :status
  使用如下:

server.use(connect.logger(':method :remote-addr'));
server.use(connect.logger('type is :res[content-type], length is '
    + ':res[content-length] and it took :response-time ms.'));

  logger还能够自定义token。如,要给请求Content-Type定义一个简写的:type token,可以采用如下方式:

connect.logger.token('type', function(req, res) {
    return req.headers['content-type'];
});

body parser中间件

  1.接收POST数据
  使用body parse中间件可以接收POST请求的数据,并将数据存储到req.body中。如:

server.use(connect.bodyParser());
server.use(function(req, res) {
    // req.body.myinput
});

  2.处理上传
  bodyParser另一功能就是使用formidable模块,它可以让你处理用户上传的文件。如:

var server = connect(
    connect.bodyParser(),
    connect.static('static')
);
server.use(function(req, res, next) {
    if('POST' == req.method && req.body.file) {
        console.log(req.body.file);
        fs.readFile(req.body.file.path, 'utf8', function(err, data) {
            if(err) {
                res.writeHead(500);
                res.end('Error!');
                return;
            }

            res.writeHead(200, {'Content-Type': 'text/html'});
            res.end([
                '<h3>File: ' + req.body.file.name + '</h3>',
                '<h4>Type: ' + req.body.file.type + '</h4>',
                '<h4>Contents:</h4><pre>' + data + '</pre>'
            ].join(''));
        });
    } else {
        next();
    }
});

  3.多文件上传
  在input的name属性上加上[],即

<input type="file" name="files[]"/>
<input type="file" name="files[]"/>

  这个时候为多文件上传,这时req.body.files就包含了一个数组。

cookie

  当浏览器发送cookie数据时,会将其写到cookie头信息中。其数据格式和URL中的查询字符串类似。如:

GET /detail HTTP/1.1
Host: 127.0.0.1
Cookie: key1=value1; key2=value2
Accept: */*

  使用cookieParser中间件就可以通过req.cookies对象轻松访问到这些cookie数据:

server.use(connect.cookieParser());
server.use(function(req, res, next) {
    // req.cookies.key1 = "value1";
    // req.cookies.key2 = "value2";
});

会话(session)

  在绝大多数Web应用中,多个请求间共享“用户会话”的概念是非常必要的。它主要通过在浏览器中设置cookie来实现,该cookie信息会在随后所有的请求头信息中被带回到服务器中。
  用户登录的案例:

var connect = require('connect'),
    users = require('./users'); // 这里直接require了JSON文件,不需要使用module.exports对数据进行暴露

var server = connect(
    connect.logger('dev'),
    connect.bodyParser(),
    connect.cookieParser(),
    // 出于安全考虑,在初始化session中间件的时候需要提供secret选项
    connect.session({secret: 'my app secret'}),
    function(req, res, next) {
        if('/' == req.url && req.session.logged_in) {
            res.writeHead(200, {'Content-Type': 'text/html'});
            res.end('Welcome back, <b>' + req.session.name + '</b>.'
                + '<a href="/logout">Logout</a>');
        } else {
            next();
        }
    },
    function(req, res, next) {
        if('/' == req.url && 'GET' == req.method) {
            res.writeHead(200, {'Content-Type': 'text/html'});
            res.end([
                '<form action="/login" method="POST">',
                '<fieldset>',
                '<legend>Please log in</legend>',
                '<p>User: <input type="text" name="user"></p>',
                '<p>Password: <input type="password" name="password"></p>',
                '<button>Submit</button>',
                '</fieldset>',
                '</form>'
                ].join(''));
        } else {
            next();
        }
    },
    function(req, res, next) {
        if('/login' == req.url && 'POST' == req.method) {
            res.writeHead(200);
            if(!users[req.body.user] || req.body.password != users[req.body.user].password) {
                res.end('Bad username/password');
            } else {
                req.session.logged_in = true;
                req.session.name = users[req.body.user].name;
                res.end('Authenticated!');
            }
        } else {
            next();
        }
    },
    function(req, res, next) {
        if('/logout' == req.url) {
            req.session.logged_in = false;
            res.writeHead(200);
            res.end('Logged out!');
        } else {
            next();
        }
    }
);

server.listen(3000);

  其中users.json文件内容如下:

{
    "DreamBoy": {
        "password": "123",
        "name": "梦小白"
    }
}

  为了让session能够在生产环境中也正常工作,我们需要通过Redis来实现一个持久化。

Redis session

  当我们登录成功后,重启node服务器,然后刷新浏览器,会发现需要重新登录,也就是说session失效或或者说不见了。
  原因在于session默认存储在内存中。这意味着session数据存储在内存中时,当进程退出后,session数据自然也就丢失了。
  生产环境中,需要使用一种当应用重启后,还能够将session信息持久化存储下来的机制,如Redis。
  Redis是一个既小又快的数据库,有一个connect-redis模块使用Redis来持久化session数据,这样就让session驻扎到了Node进程之外。
  使用如下(必须要安装好Redis):

var connect = require('connect'),
    RedisStore = require('connect-redis')(connect);

  使用中间件:

server.use(connect.session({store: new RedisStore, secret: 'my secret'}));

methodOverrid中间件

basicAuth中间件

注:暂不说明。

总结

  1. 中间件是串行执行的。
  2. 使用中间件的好处:代码能以此为构建单元进行组织,并且能够获得高复用性。
  3. Connect是实现了中间件这一思路的模块,它为构建更具表达力的中间件提供了基础架构。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node中的Connect——常用中间件 的相关文章

  • Intellij IDEA使用注解创建Hibernate项目中的OR映射类

    上回说到 xff1a Intellij IDEA下的第一个Hibernate项目 我们需要创建 对象到关系的映射配置文件 xff0c 如 entity hbm xml xff08 其中 entity 是我们将要创建的实体 xff09 下面讲
  • Hibernate中Blob对象类型的使用

    使用Intellij IDEA创建Hibernate项目 xff0c 目录结构如下 xff1a 其中 assets app png 为将要存储的照片 xff0c src hibernate cfg xml 为Hibernate的配置文件 x
  • Hibernate组件映射

    转载自 xff1a 点击打开链接 在Hibernate中 component 是某个实体的逻辑组成部分 xff0c 它与实体的根本区别是没有oid xff08 对象标识符 xff09 xff0c component是一个被包含的对象 它作为
  • Hibernate中的单向一对多关联

    源自 imooc 中的学习 Hibernate中的单向一对多关联 xff0c 这里举例 班级对学生 的单向一对多关联 xff0c 即一个班级可以有多个学生 那么在Hibernate中实体对象间如何体现出单向一对多的关联关系呢 xff1f 如
  • Hibernate中的单向多对一关联

    继上回讲到 Hibernate中的单向一对多关联 xff0c 这次来实现一下Hibernate中的单向多对一关联 对原来的项目修改如下 xff1a Hibernate中的单向多对一关联 xff0c 需要我们在多方增加一个一方的属性 xff0
  • Hibernate中的双向多对一关联以及 inverse属性、cascade属性的用法

    上回 说了 Hibernate中的单向一对多关联 和 Hibernate中的单向多对一关联 这次针对这两个 单向 进行整合即可实现双向的多对一关联 如 xff1a 学生与班级的关系 在Grade类中需要添加 Set集合保存Student对象
  • 优化器 optimizer

    优化器 optimizer optimizer 优化器 xff0c 用来根据参数的梯度进行沿梯度下降方向进行调整模型参数 xff0c 使得模型loss不断降低 xff0c 达到全局最低 xff0c 通过不断微调模型参数 xff0c 使得模型
  • Hibernate中的多对多关联

    源自 imooc 的学习 多对多关联是一种常见的关联关系 多对多关联关系一般采用中间表的形式来实现 xff0c 即新增一张包含关联双方主键的关联表 那么 xff0c 在Hibernate中如何实现多对多的关联关系呢 xff1f 多对多关联可
  • HQL数据查询基础(一)

    源自 imooc 的学习 什么是HQL呢 xff1f HQL 是Hibernate Query Language xff0c Hibernate查询语言 xff1b 同时HQL是一种面向对象的查询语言 xff0c HQL查询的主体是映射配置
  • HQL数据查询基础(二)

    继上回 xff08 HQL数据查询基础 xff08 一 xff09 xff09 说到的例子 网上商店 xff0c 来继续完善持久化类和配置文件的创建 上回 在 com imooc model 包中创建 Seller java 持久化类 xf
  • HQL数据查询基础(三)

    继上回 xff08 HQL数据查询基础 xff08 二 xff09 xff09 xff0c 针对 网上商店 这个例子 xff0c 来讲解一些HQL简单的子句用法 xff08 以下的所有测试方法均在 MyTest java 测试类 xff08
  • Maven中pom.xml的解析

    Maven项目中的 pom xml lt project xmlns 61 34 http maven apache org POM 4 0 0 34 xmlns xsi 61 34 http www w3 org 2001 XMLSche
  • IntelliJ使用指南—— 导入Eclipse的Web项目

    通常一个团队中可能有人用eclipse xff0c 有人用intelliJ xff0c 那么经常会出现需要导入别人用eclipse建好的web项目 而IntelliJ提供了多种项目类型的导入方式 xff0c 其中就有eclipse 在初始窗
  • JQuery、JSON、Ajax在Servlet中的应用

    1 在Java中正确得到JSONObject xff0c 需要导入JSON的JAVA支持包 json lib 2 3 jdk15 jar xff0c 同时需导入 JSON依赖包 commons logging 1 0 4 jar xff0c
  • 20个很有用的CSS技巧

    转载自 xff1a 20个很有用的CSS技巧 导语 xff1a 下面这几个 CSS 技巧你可能不知道 xff0c 1 彩色照片变黑白 xff0c 2 所有元素垂直居中 xff0c 3 禁用鼠标 xff0c 4 模糊文字 xff0c 小编学完
  • 「理解HTTP」之常见的状态码

    转载自 xff1a 理解HTTP 之常见的状态码 状态码的职责是当客户端向服务器端发送请求时 xff0c 描述返回请求结果 借助状态码 xff0c 用户可以知道服务器端是正常处理了请求 xff0c 还是出现了什么错误 RFC2616 定义的
  • jQuery UI的简单使用,轻松实现二级菜单

    jQuery UI 的API手册地址 xff1a http api jqueryui com jQuery UI 实现百叶窗效果 菜单 Tab导航 xff1b 最后组合 百叶窗效果 43 菜单 xff0c 实现二级菜单 案例如下 xff1a
  • Python爬虫实战:抓取并保存百度云资源(附代码)

    專 欄 王雨城 xff0c Python中文社区专栏作者 博客 xff1a http www jianshu com u 88ff70818bd1 寻找并分析百度云的转存api 首先你得有一个百度云盘的账号 xff0c 然后登录 xff0c
  • Android 系统禁止应用的某个弹框

    需求 xff1a 谷歌拼音输入法首次使用会弹出以下提示 xff0c 为了提高用户体验 xff0c 在系统层屏蔽此弹窗 这里以谷歌输入法首次使用为例 分析 xff1a 系统dialog的弹出都是集成Dialog java 所以我们先找到dia
  • mysql中的null值和空值区别

    转载自 xff1a 点击打开链接 标签 xff1a 笔记 mysql null 发表时间 xff1a 2014 06 06 23 46 作者 xff1a 出处 xff1a http jackyrong iteye com mysql中的nu

随机推荐

  • bootstrap-table的入门使用——从服务器获取数据

    参考 xff1a Bootstrap Table 查询 xff08 服务器端 xff09 刷新数据 这里需要使用 bootstrap table 插件 使用了CSS3loader显示加载过程 效果如下 xff1a index html lt
  • MySql中UTF8 和 GBK 编码中文字符长度问题

    转载自 xff1a MySql中UTF8 和 GBK 编码中文字符长度问题 MySql中UTF8 和 GBK 编码中文字符长度问题 出处 xff1a http blog csdn net 为什么要了解MySql中UTF8 和 GBK 编码中
  • PHP对表单提交特殊字符的过滤和处理

    转载自 xff1a PHP对表单提交特殊字符的过滤和处理 函数名 释义 介绍htmlspecialchars将与 单双引号 大于和小于号化成HTML格式 amp 转成 amp amp 34 转成 amp quot 39 转成 amp 039
  • ThinkPHP中数据库操作返回值总结

    转载自 xff1a ThinkPHP中数据库操作返回值总结 关键字 xff1a Thinkphp 返回值 数据库操作 select返回值 add返回值 setDec返回值 Thinkphp中的Think Model类提供了数据库的基本CUR
  • 基于 Token 的身份验证

    转载自 xff1a 基于 Token 的身份验证 最近了解下基于 Token 的身份验证 xff0c 跟大伙分享下 很多大型网站也都在用 xff0c 比如 Facebook xff0c Twitter xff0c Google 43 xff
  • 打造 Bootstrap Tags Input 同 Modal 结合的利器

    Boostrap Tags input 的使用 xff1a http bootstrap tagsinput github io bootstrap tagsinput examples Boostrap Tags Input 插件基于Bo
  • 打造 Bootstrap Tags Input 同 Modal 结合的利器(改)

    对上文 打造 Bootstrap Tags Input 同 Modal 结合的利器 中的 js 进行整合 xff0c 如下 xff1a bootstrap tagsinput demo js Created by DreamBoy on 2
  • 我的简单PHP框架——LabPHP v1.0.1

    此前讲到 我做的一个基于MVC设计思想的简单PHP框架 xff08 我的简单PHP框架 LabPHP xff09 xff0c 这里对其进行一些改进 xff0c 改进地方如下 xff1a 1 对 LabPHP Common functions
  • 关于ThinkPHP中URL及模板文件名大小写的讨论

    参考 xff1a ThinkPHP3 2 3完全开发手册 URL模式 thinkphp中处理url大小写敏感的技术方案 TP模板因路径大小写获取不到的Bug 特别地 xff0c 需要注意的是 xff1a 调试模式下URL区分大小写 xff1
  • 【免费送书】说说哪本书曾经让你爱不释手

    编程狗在线 自由的编程学习平台 一本好书带给人的不止于知识收获 xff0c 还会对你的成长有所帮助 xff0c 与你的每次经历产生共鸣 每天读一点 xff0c 坚持不懈 xff0c 你就能成为专业高手 如果你能每两个月读一本好的编程书 xf
  • PHP中的cURL函数

    今天看了一个接口的使用 xff0c 其中接口的示例中使用到PHP的cURL函数 xff0c 那么有趣的事情就来了 使用PHP向某个URL发送数据并接收响应数据 xff1a function request data url data 61
  • 设计模式之适配器(Adapter)模式

    转载自 xff1a 设计模式学习笔记 适配器 Adapter 模式 参考 xff1a Java设计模式之Adapter模式 2 自己阅读了原文中的例子颇有受益 xff0c 在此前常听到Java中adapter适配器一词 xff08 虽说现在
  • Java软件体系结构设计模式之结构模式 知识点摘录

    以下知识点摘录自 xff1a Java软件体系结构设计模式标准指南 一书 其中可能包含本人的一些感悟 Java软件体系结构设计模式之结构模式 xff08 11种 xff09 结构模式主要用来 xff1a 1 xff09 处理把责任委托给其他
  • 支付宝在线支付接口开发教程与总结

    转载自 xff1a 支付宝在线支付接口开发教程与总结 1 什么是第三方支付 所谓第三方支付 xff0c 就是一些和各大银行签约 并具备一定实力和信誉保障的第三方独立机构提供的交易支持平台 在通过第三方支付平台的交易中 xff0c 买方选购商
  • Android 应用商店评分+APP分享

    转载自 xff1a Android Market链接的生成 调用Market 搜索软件 Android 调用已安装市场 xff0c 进行软件评分的功能实现 参考 xff1a Android跳转到应用商店的APP详情页面 xff0c 以及 G
  • 用一个二维码做下载地址,自动区分是 ios 还是 android

    转载自 xff1a 用一个二维码做下载地址 xff0c 自动区分是 ios 还是 android 更多参考 xff1a 好推二维码如何通过应用宝微下载支持微信自动打开APP下载 xff1f 用一个二维码做下载地址 xff0c 自动区分是 i
  • Node中的JavaScript

    Node中的JavaScript global对象 在浏览器中 xff0c 全局对象指的就是window对象 xff1b Node中有两个类似却各自代表着不同含义的对象 xff1a global和process xff1b 任何global
  • Node中的HTTP

    来自对 了不起的Node js 一书的学习 HTTP协议 超文本传输协议 xff0c 又称为HTTP xff0c 是一种Web协议 HTTP协议构建在请求和响应的概念上 xff0c 对应在Node js中就是由http ClientRequ
  • Node中的Connect

    来自对 了不起的Node js 一书的学习 Connect Node js为常规的网络应用提供了基本的API 然而 xff0c 实际情况下 xff0c 绝大部分网络应用都需要完成一系列类似的操作 xff0c 这些类似的操作你一定不想每次都重
  • Node中的Connect——常用中间件

    接下来介绍一个Connect内置的一些中间件 xff1a static中间件 1 挂载 static允许将任意一个URL匹配到文件系统中任意一个目录 如 xff1a 将 my images URL和名为 images的目录对应起来 xff0