HTTP构建一个网站:

var http = require('http');
var fs = require('fs');
var server = http.createServer(function(req, res) {
if('GET' === req.method && '/img' === req.url.substr(0,4) && '.jpg' === req.url.substr(-4)) {
fs.stat(__dirname + req.url, function(err, stat) { //检查文件是否存在
if(err || !stat.isFile()) {
res.writeHead(404);
res.end('Not Found');
return;
}
serve(__dirname + req.url, 'image/png'); //'application/jpg':会下载图片
});
} else if('GET' === req.method && '/' === req.url) {
serve(__dirname + '/index.html','text/html');
} else {
res.writeHead(400);
res.end('Not Found');
}
function serve(path, type) {
res.writeHead(200, {'Content-Type': type});
fs.createReadStream(path).pipe(res); //将文件系统流接到HTTP响应流中;
} });
server.listen(3000);

通过connect实现一个网站:

  • 创建package.json:

    {
    "name": "my-website",
    "version": "0.0.1",
    "dependencies": {
    "connect": "1.8.7"
    },
    "description": "an connect website"
    }
  • 安装依赖:npm install;
  • 代码例子:
    //用connect修改http构建的网站;
    var connect = require('connect');
    var server = connect.createServer(); //可以简化 server = connect();
    server.use(function(req, res, next) {
    console.log(' %s: %s ', req.method, req.url);
    next(); //下一个中间件;
    });
    server.use(function(req, res, next) {
    if('GET' === req.method && '/img' === req.url.substr(0,4)) {
    console.log('img');
    } else {
    next();
    }
    });
    server.use(function(req, res, next) {
    if('GET' === req.method && '/' === req.url) {
    console.log('index');
    } else {
    console.log('other');
    next();
    }
    });
    server.use(function(req, res, next) {
    res.writeHead(404);
    res.end('Not Found');
    }); server.listen(3000);

中间件://中间件由函数组成,它除了处理req,res对象外还接受 一个next函数做流控制;

//sample.js
/*
请求超时
*/
module.exports = function(opts) {
var time = opts.time || 100;
return function(req, res, next) {
console.log(1);
var timer = setTimeout(function() {
console.log('\033[90m%s %s\033[91mis taking too long!\033[39m', req.method, req.url);
}, time);
var end = res.end;
res.end = function(chunk, encoding) {
res.end = end;
res.end(chunk, encoding);
clearTimeout();
}
next();
}
} //main.js
var connect = require('connect');
var time = require('./3.2');
var server = connect.createServer();
/*
记录请求情况
*/
server.use(connect.logger('dev'));
/*
实现时间中间件
*/
server.use(time({time: 500}));
/*
快速响应
*/
server.use(function(req, res, next) {
if('/a' === req.url) {
res.writeHead(200);
res.end('Fast!');
} else {
next();
}
});
/*
慢速响应
*/
server.use(function(req, res, next) {
if('/b' === req.url) {
setTimeout(function() {
res.writeHead(200);
res.end('slow');
}, 1000);
} else {
next();
}
}); server.listen(3000);
  • static中间件:

    • 挂载:将任意一个URL匹配到文件系统中任意一个目录

      server.use('/my-images', connect.static(__dirname + '/website/img'));
    • maxAge:设置一个资源客户端缓存的时间
      server.use('/js', connect.static(__dirname, {maxAge:10000}));
    • hidden:设置为true的话,connect也会托管文件系统中的隐藏文件
      server.use(connect.static(__dirname, {hidden:true}));
  • query中间件:获取查询字符串  //query中间件在express中默认是启用的;
    server.use(connect.query())
    server.use(function (req, res) {
    console.log(req.query.name); //req.query对象格式返回,如访问xxx?name = jinks;返回{name:'jinks'}
    })
  • logger中间件:诊断工具;将发送进来的请求信息和发送出去的响应信息打印在终端
    • server.use(connect.logger('dev'));

    • server.use(connect.logger('default'));

    • server.use(connect.logger('short'));

    • server.use(connect.logger('tiny'));

    • server.use(connect.logger(':method :remote-addr'  :res[Content-Length]));  //自定义格式输出; 查看完整的token
  • bodyParser中间层:
    • 与http模块中使用qs模块解析post请求消息体一样,bodyParser中间层也具有这样功能;

      server.use(connect.bodyParser());
      server.use(function(req, res, next) {
      //req.body;
      }
    • 其另一个功能就是处理用户上传的文件;
      var connect = require('connect');
      var fs = require('fs');
      var server = connect(connect.logger('dev'),connect.static('static'),connect.bodyParser()); //简化加载中间件
      //设置默认url:'/'为文件系统中static文件夹,如果有Index.html,就加载此项;
      server.use(function(req, res, next) {
      if('POST' === req.method ) {
      fs.readFile(req.files.files.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.files.files.name + '</h3>',
      '<h4>Type: ' + req.files.files.type + '</h4>',
      '<h1>Contents:</h4><pre>' + data + '</pre>'
      ].join(''));
      });
      } else {
      next();
      }
      }) server.listen(3000);
  • cookieParser中间件; //读写cookie数据
    server.use(connect.cookieParser());
    
    server.use(function(req, res ,next) {
    //req.cookies //对象形式返回
    });
  • session中间件;

    • 出于安全考虑,在初始化session中间件的时候需要提供secret选项

      connect.session({secret: 'my app secret'})
    • 使用req.sesstion记录数据:    req.session.logged_in; req.session.name

创建会话:

--------------users.json----------------------------------
//当只要对外暴露数据时,不需要module.exports而直接把数据文件以JSON形式暴露出来
{
"jinks": {
"password" : "ferret",
"name": "jinks"
}
} --------------app.js------------------------------------
var connect = require('connect');
var users = require('./users'); var server = connect(
connect.logger('dev'),
connect.bodyParser(),
connect.cookieParser(),
connect.session({secret: 'my app secret'}),
function(req, res, next) {
console.log(req.session.logged_in);
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);

  

node工具--connect的更多相关文章

  1. node工具--express

    //使用supervisor  Connect是基于HTTP米快创建的:Express则是基于Connect上创建的: 绝大多数web服务器和浏览器之间的任务是通过url和method完成的,两者的组 ...

  2. node工具是是什么东西

    Node到底是个啥? Node是一个服务器端JavaScript解释器,可是真的以为JavaScript不错的同学学习Node就能轻松拿下,那么你就错了,总结:水深不深我还不知道,不过确实不浅 最近写 ...

  3. node工具之nodemon

    nodemon nodemon是一种工具,可以自动检测到目录中的文件更改时通过重新启动应用程序来调试基于node.js的应用程序. 安装 npm install -g nodemon //或 npm ...

  4. node工具之node-ip

    node-ip node.js用来获取id地址的工具 use var ip = require('ip'); ip.address() // my ip address ip.isEqual('::1 ...

  5. node工具之pm2

    pm2 PM2是带有内置负载平衡器的Node.js应用程序的生产过程管理器.它使您可以使应用程序永远保持活动状态,无需停机即可重新加载它们,并简化常见的系统管理任务. 安装 npm install p ...

  6. node工具之http-proxy-middleware

    简介 一个轻松的配置代理服务器的中间件,让Node.js代理变得简单 url路径 foo://example.com:8042/over/there?name=ferret#nose \_/ \___ ...

  7. Connect is a middleware layer for Node.js

     Connect is a middleware layer for Node.js   http://senchalabs.github.com/connect Connect Connect is ...

  8. NTVS:把Visual Studio变成Node.js IDE 的工具

    NTVS(Node.js Tools for Visual Studio) 运行于VS2012或者VS2013.一些node.js的爱好者已经从PTVS(Python Tools for Visual ...

  9. 使用node.js开发一个生成逐帧动画小工具

    在实际工作中我们已经下下来不下于一万个npm包了,像我们熟悉的 vue-cli,react-native-cli 等,只需要输入简单的命令 vue init webpack project,即可快速帮 ...

随机推荐

  1. 一张图解释Hadoop IPC

    基于hadoop2.6.2.... 一张图Server启动,Client访问..... RPC是IPC的一种,IPC还有另外一种LPC,相关请看参考中的3 使用hadoop ipc步骤: 1.定义RP ...

  2. 如何让Ubuntu系统支持WebP图片格式

    本文主要向大家介绍如何让 Ubuntu 系统支持查看 WebP 图片格式,以及如何将 WebP 转为 JPEG 或 PNG 图片格式的方法. 什么是WebP图片 Google开发并推出 WebP 图片 ...

  3. [BZOJ1789][BZOJ1830][Ahoi2008]Necklace Y型项链

    [BZOJ1789][BZOJ1830][Ahoi2008]Necklace Y型项链 试题描述 欢乐岛上众多新奇的游乐项目让小可可他们玩的非常开心.现在他们正在玩比赛串项链的游戏,谁串的最快就能得到 ...

  4. Coursera台大机器学习技法课程笔记03-Kernel Support Vector Machine

    这一节讲的是核化的SVM,Andrew Ng的那篇讲义也讲过,讲的也不错. 首先讲的是kernel trick,为了简化将低维特征映射高维特征后的计算,使用了核技巧.讲义中还讲了核函数的判定,即什么样 ...

  5. python4delphi 安装

    环境搭建: 目前p4d已经可以支持到XE7,可惜googlecode即将关闭,不知道作者是否会在github上继续更新. 因为此开源项目历史较久远,拿到源代码后可能还需要手动修改相关的文件引用,毕竟需 ...

  6. total commander相关设置

    一. 中文语言包 在官方网站上提供有简体中文语言包,下面的说明以此为准.下载的语言包放至Total Commander安装目录下的Language子目录中.从菜单“Configuration”→“Op ...

  7. C#静态static的用法

    一.静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来 ...

  8. 【leetcode】Palindrome Partitioning

    Palindrome Partitioning Given a string s, partition s such that every substring of the partition is ...

  9. 【leetcode】Sort List

    Sort List Sort a linked list in O(n log n) time using constant space complexity.   需要采用归并排序对链表进行操作. ...

  10. c++11之bind

    std::bind是个c++推出的新的特性,非常有用,让你写起来率试不爽. #include <iostream> using namespace std; #include <fu ...