读书笔记-《了不起的nodejs》-connect内置中间件

享受独处时光

周末的下雨天,这个光线刚刚好,一整天不出门简直太酥服~

connect内置中间件

Static中间件

挂载

?:让/my-images URL和名为/images的目录对应起来

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

maxAge

?:给文件设置缓存时效

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

hidden

给如果是true,connect就会托管那些以(.)开始的UNIX文件系统中被认为是隐藏的文件。

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

query中间件

使用query中间件,能够通过req.query对象自动获取地址上带的查询字符串:

挂载

?:url /blog-post?page=5

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

logger中间件

logger中间件能将发送进来的请求信息和发送出去的响应信息打印到终端

它提供了四种日志格式:default、dev、short、tiny。

var connect = require('connect');
connect.createServer(
  connect.logger('dev'),
  function(req,res){
    res.writeHead(200);
    res.end('Hello world')
  }
).listen(3000)

在终端执行:node index.js,然后在浏览器访问127.0.0.1:3000,终端:

dev是一种精准简短的日志格式,提供了行为方式及性能方面的信息。

body parse中间件

bodyParse功能类似物http模块的例子中我们使用qs解析请求的消息体;

?:处理上传

var server = connect(
  connect.bodyParse(),
  connect.static('static');  
)

在static/文件夹中,创建一个index.html:

<form action="/" method="POST" enctype="multipart/form-data">
  <input type="file"/>
  <button>Send File!</button>
</form>

Session(会话)

会话系统,主要通过在浏览器中设置cookie来实现,该cookie信息随后在所有的请求信息中被带回到服务器。

connect也提供了简单的实现方式,我们创建一个简单的登录系统:

// 模块依赖
var connect = require('connect'),
users = require('./users');
var server = connect(
    connect.logger('dev'),
    connect.bodyParser(),
    // session中间件需要操作cookie,所以在这里引入cookieParser中间件
    connect.cookieParser(),
    connect.session({secret : 'my all secret'}),
    // 出于安全考录,在初始化session中间件的时候需要提供secret选项
    // 将车用户是否登录,若已登录展示欢迎,若未登录则交给其他中间件
    function(req,res,next){
        if('/'==req.url && req.session.logged_in){
            res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});
            res.end(
                '欢迎 <b>'+req.session.name + '</b>回来!' 
                + '<a href="/logout"></a>'
            );
        }else{
            next();
        }
    },
    // 若用户未登录,切请求地址是’/‘,则展示表单
    function(req,res,next){
        if('/'==req.url && 'GET'== req.method){
            res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});
            res.end([
                '<form action="/login" method="POST">',
                '<fieldset>',
                '<legend>请登录</legend>',
                '<p>用户名:<input type="text" name="user"/></p>',
                '<p>密码:<input type="password" name="password"/></p>',
                '<button>登录</button>',
                '</fieldset>',
                '</form>'
            ].join(''))
        }else{
            next();
        }
    },
    // 当提交表单时,若用户名密码错误则展示错误,否则展示成功
    function(req,res,next){
        if('/login'==req.url && 'POST'== req.method){
            res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});
            if(!users[req.body.user] || req.body.password != users[req.body.user].password){
                res.end('<p>用户名或密码错误<p>')
            }else{
                // 在这里修改req.session对象,该对象在响应发出去时自动保存,无须手动处理
                req.session.logged_in = true;
                req.session.name = users[req.body.user].name;
                res.end('<p>登陆成功<p>');
            }
            
        }else{
            next();
        }
    },
    // 若请求logout,则登出
    function(req,res,next){
        if('/logout'==req.url){
            req.session.logged_in = false;
            res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});
            res.end('<p>已退出<p>');
        }else{
            next();
        }
    },
);

server.listen(3000);

然后创建json:

{
    "Lin":{
        "password":"123456",
        "name":"Lin"
    }
}

然后在终端执行:node login.js,在浏览器访问localhost:3000

输入用户名密码:

点击登录后:

再去访问localhost:3000:

访问localhost:3000/logout退出:

若输入错误密码:

呜呼,各位宝宝们,是不是还挺好玩的,咱们前端也能搞自己的服务器。这个简单的登录系统还凑合哈。你千万别手懒哈,一起来coding啊!

愿我们有能力不向生活缴械投降---Lin

本文分享自微信公众号 - 女程序员的日常(gh_df41d619fb70)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏sktj

bootstrap 胶囊式 导航栏

<!doctype html> <html> <head> <meta charset="utf-8"> <title>联想控股</title> <m...

12530
来自专栏sktj

bootstrap 面包屑 常用

<!doctype html> <html> <head> <meta charset="utf-8"> <title>联想控股</title> <m...

12140
来自专栏sktj

bootstrap 警告框 提示框 带关闭 常用

<!doctype html> <html> <head> <meta charset="utf-8"> <title>联想控股</title> <m...

7650
来自专栏新智元

Reddit热议!DeepMind最新研究解决灾难性遗忘难题

这篇由DeepMind研究团队出品的论文名字叫“Functional Regularisation for Continual Learning”(持续学习的功...

11050
来自专栏sktj

bootstrap 垂直式导航栏

<!doctype html> <html> <head> <meta charset="utf-8"> <title>联想控股</title> <m...

13410
来自专栏软测小生

Katalon Studio 基本用法--录制脚本并查看测试报告

① 手机连接在电脑上,点击 Record Mobile,这里选择一款房屋租赁App,可以在应用商店中下载

29440
来自专栏sktj

bootstrap 导航栏 3

<!doctype html> <html> <head> <meta charset="utf-8"> <title>联想控股</title> <m...

8220
来自专栏web前端教室

你的前端开发的优势是什么?

每个前端开发都要有自己的优势,总结一下我的优势,1、工作年限长、经验多;2、基础相对扎实;3、逻辑思维能力合格;4、业务需求分析能合格。基本上就这四点吧,一般来...

15630
来自专栏三掌柜的技术空间

iOS开发:字符串处理:截取字符串、匹配字符串、分割字符串

分享一个比较基础的知识点,记录一下,以备以后使用的时候查找方便,现在岁数大了,脑子不好使了,记忆力减退,年轻人可以忽略此博客。本篇要分享的是关于iOS开发中,字...

15350
来自专栏风吹杨柳

20140921遇到的问题-----JAVA----JS------jquery-1.11.1.min.js导入MyEcilpse报错的解决办法

最近把别人帮我写的一个JS文件一起导入到项目中,由于他的方法中用到了jquery-1.11.1.min.js,

7930

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励