//使用supervisor 

Connect是基于HTTP米快创建的;Express则是基于Connect上创建的;

绝大多数web服务器和浏览器之间的任务是通过url和method完成的,两者的组合称为路由;

使用express:

  • 引入:

    var express = require('express');
    var app = express.createServer();

//express 4.x修改:

var express = require('express');
var app = express();
  • 配置: app.set();

    app.set('view engine', 'ejs');                  //模版引擎
    app.set('views', __dirname + '/views'); //目录 //console.log(app.set('views')) //查询某一配置
  • 定义路由:
  • 加载视图render:
    • 初始化模版引擎
    • 读取视图文件并将其传递给模版引擎
    • 获取解析后的HTML页面并作为响应发送给客户端
      app.get('/', function(req, res) {
      res.render('index');
      //由于之前在app.set()中配置视图引擎,所以不需要显示指明index.ejs
      });
  • 使用superagent //ajax api

例子:

  • package.json:

    {
    "name": "express-tweet",
    "version": "0.0.1",
    "dependencies": {
    "express": "2.5.9",
    "ejs": "0.4.2",
    "superagent": "0.3.0"
    }
    } 
  • 为避免将HTML代码嵌入到应用逻辑中,使用模版语言来处理:EJS(embedded js);
    //这里将他们放到views文件夹中
    ---------------index.ejs------------------ <h1>Twitter app</h1>
    <p>Please enter your search term:</p>
    <form action='/search' method='GET'>
    <input type='text' name='q'/>
    <button>Search</button>
    </form> -----------------serach.ejs----------------- <h1>Tweet results for <%= search %></h1>
    <% if(results.length) { %>
    <ul>
    <% for(var i = 0; i < results.length; i++) { %>
    <li><%= results[i].text %>- <em><%= results[i].form_user %></li>
    <% } %>
    </ul>
    <% else %>
    <p>No results</p>
    <% } %>  
  • js代码:
    ------------search.js------------------
    var request = require('superagent'); //ajax api module.exports = function search(query, fn) {
    request.get('https://twitter.com/search')
    .send({q:query})
    .end(function(res) {
    if(res.body && Array.isArray(res.body.results)) {
    return fn(null, res.body.results);
    }
    fn(new Error('Bad twitter response'));
    })
    } -------------------------server.js--------------------------
    var express = require('express');
    var search = require('./search'); var app = express.createServer(); app.set('view engine', 'ejs');
    app.set('views', __dirname + '/views'); app.set('view options', {layout: false}); app.get('/', function(req, res) {
    res.render('index');
    }); app.get('/search', function(req, res, next) {
    search(req.query.q, function(err, tweets) {
    if(err) return next(err);
    res.render('search', {results: tweets, search: req.query.q});
    })
    }); app.listen(3000);

设置://express具有对环境设置的管理能力;比如在生产环境下,为了提高性能可以让express将模版缓存起来加快响应速度;而在开发环境下这样会使每次模版改动都要重启服务器;所以可以通过改变当前环境设置的方法解决问题;

  • 设置环境://默认为’development'

    • process.env.NODE_ENV = 'production';
    • app.set('env', 'production');
    • NODE_ENV=production node app.js;   //window下不行
  • app.configure:
    //全局
    app.configure(function(){
    app.set('title', 'My Application');
    }); //仅在production下
    app.configure(’production',function(){
    app.set('title', 'My Application');
    });
    //对于布尔值类型的设置可以直接用
    app.disable('view cache');
    app.enable('view cache');
    //app.configure可以用条件判断语法取代。
    
    if ('development' == app.get('env')) {
    //---
    } if ('production' == app.get('env')) {
    //---
    }
  • 一些其他设置:

    • case sensitive routing 路由的大小写敏感, 默认是关闭状态;

    • strict routing 路由的严格格式, 默认情况下 "/foo" 和 "/foo/" 是被同样对待的;

模板引擎:

  • 在开头的时候全部配置:

    app.set('view engines','ejs');
    ---使用时可以直接省略后缀---
    app.get('/', function(req, res) {
    res.render('index');
    });
  • 直接使用
    app.get('/', function(req, res) {
    res.render('index.html');
    });
  • app.register:将扩展名匹配到指定的模版引擎: app.register('.html',require('jade'));

错误处理:

  • app.error:

    app.error(function(err, req, res, next) {
    if('Bad twitter response' == err.message){
    res.render('twitter-error');
    } else {
    next();
    }
    });
  • 设置多个:如当调用next并且对应的处理器无法找到时,默认的express错误处理器就会触发
    app.error(function(err, req, res) {
    res.render('error', {status: 500});
    })

路由:

  • 自定义参数:

    app.get('/', function(req, res) {
    
    });
    app.get('/post/:name', function(req, res) {
    //req.params.name
    });
    app.get('/post/:name?', function(req, res) {
    //表示:name是可选的,即可以匹配/post,也可以匹配/post/..
    });
  • 可以直接使用RegExp对象设置路由;
  • 在路由处理程序中使用next; //即当一个路由匹配,还是可以强制express继续匹配其他路由
    app.get('/post/:name', function(req, res, next) {
    if('h' != req.params.name[0]) return next();
    //...........
    });

中间件:由于express是构建与connect之上的,当创建服务器时可以直接使用connect兼容的中间件;

app.use(express.static(__dirname + '/img'));
app.use(express.cookieParser());
app.use(express.session());
  • express还允许中在特定匹配到的路由器中使用中间层;

    function secure(req, res, next) {
    if(!req.session.logged_in) {
    return res.send(403);
    }
    next();
    }; app.get('/home', function() {
    //accessible to everyone
    }); app.get('/financials',secure, function() {
    //secure
    }); app.get('/about', function() {
    //accessible to everyone
    }); app.get('/roadmap', secure, function() {
    //secure
    }); ---------------------------为路由定义多个中间件
    app.post('/route',a,b,c,function(){});
    --------------------------中间件中调用next
    function secure(req, res, next) {
    if(!req.session.logged_in) {
    return next('route');
    }
    next();
    };

代码组织://第一准则:模块化;

好的代码组织当是维护一个server.js文件,该文件中包含了路由表,同时将每一部分的路由处理器通过模块化的方式来引入;

  • 首先定义依赖的模块并初始化app,引入中间件:

    var express = require('express'),
    blog = require('./blog');
    pages = require('/pages'); var app = express.createServer();
  • 接着定义路由表:
    app.get('/blog', blog.home);
    app.get('blog/serach',blog.search); app.get('pages', pages.home);
    app.get('pages/list', pages.list);
  • 然后设置每个模块需要的exports函数:
    //blog.js
    exports.home = function(req, res, next){....};
    exports.search = function(req, res, next){....};

express4x

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

  1. Node.js Express 框架

    Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP ...

  2. Windows下Node.js+Express+WebSocket 安装配置

    Linux参考: Linux安装Node.js 使用Express搭建Web服务器 Node.js是一个Javascript运行环境(runtime).实际上它是对Google V8引擎进行了封装.V ...

  3. Node 之 Express 学习笔记 第一篇 安装

    最近由于工作不忙,正好闲暇时间学学基于 node 的 web开发框架. 现在关于web开发框架除了Express 还有新出的 KOA以及其它一些. 但是想想还是先从 Express 入手吧.因为比较成 ...

  4. Node.js_06 express

    一.初探 1 express是什么 Express.js 框架是目前最流行的node.js后端框架之一, 相当于jQuery和js之间的关系; Express 不对 Node.js 已有的特性进行二次 ...

  5. Node.js Express连接mysql完整的登陆注册系统(windows)

    windows学习环境: node 版本: v0.10.35 express版本:4.10.0 mysql版本:5.6.21-log 第一部分:安装node .Express(win8系统 需要&qu ...

  6. Node.js Express 框架学习

    转载:http://JavaScript.ruanyifeng.com/nodejs/express.html#toc0 感觉很牛的样子,不过觉得对初学者没太大用,里面很多例子用的api都没有详细的说 ...

  7. Nodejs学习笔记(六)--- Node.js + Express 构建网站预备知识

    目录 前言 新建express项目并自定义路由规则 如何提取页面中的公共部分? 如何提交表单并接收参数? GET 方式 POST 方式 如何字符串加密? 如何使用session? 如何使用cookie ...

  8. React+Node.js+Express+mongoskin+MongoDB

    首发:个人博客,更新&纠错&回复 采用React + Node.js + Express + mongoskin + MongoDB技术开发的一个示例,演示地址在这里,项目源码在这里. ...

  9. Node.js Express框架

    Express 介绍 Express是一个最小的,灵活的Node.js Web应用程序框架,它提供了一套强大的功能来开发Web和移动应用程序. 它有助于基于Node Web应用程序的快速开发.下面是一 ...

随机推荐

  1. angular问题总结与反思

    因为工作中实际开发需要,才开始接触angular框架.从当初的比葫芦画瓢,被各种问题.概念折磨摧残,到现在有一定的了解认识,觉得有必要将自己的认识进行简单的总结.不到位的地方还望多多包涵. 1.双向数 ...

  2. 入门必看--JavaScript基础

    JavaScript他是一种描述性语言,其实他并不难学,只要用心学,一定会学好,我相信大家在看这篇文章的时候,一定也学过HTML吧,使用JavaScript就是为了能和网页有更好的交互,下面切入主题. ...

  3. HNU 12833 Omar’s Bug(分情况讨论)

    题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12833&courseid=268 解题报告:有个11个 ...

  4. 腾讯即时聊天sdk

    一. 初始化 腾讯即时通讯sdk 1. 程序日志注册 2. 连接通知回调  专门的类管理 3. 信息通知回调 专门的类 4. 初始化sdk 5. 注册推送 分ios8/ios以前 注册推送成功回调 发 ...

  5. ssh和mvc理论基础

    ssh中mvc到底指的什么 mvcsshhibernatespringstrutsioc在SSH整合的架构中,Spring充当了一个容器的作用,Spring使用IOC和AOP技术接管了Hibernat ...

  6. apache virtualhost配置 apache配置多个网站

    第一步 apache下httpd.conf文件 启用模块LoadModule vhost_alias_module modules/mod_vhost_alias.so 第二步 apache下http ...

  7. 【Python】Django支持事务方式

    代码: with transaction.atomic(): for i in xrange(int(svc_instance_num)): tmp_fileprotect_svc_instance ...

  8. 【云计算】基于Ansible的自动部署平台化思路

    目标: 1.自动化—支持命令行.webui.api调用 2.支持基础命令.脚本.复杂任务编排.满足生产环境各类模块自动化部署需求 3.满足生产环境(开发.测试.线上)性能.可靠性.安全性要求 4.流程 ...

  9. 43. 动态规划求解n个骰子的点数和出现概率(或次数)[Print sum S probability of N dices]

    [题目] 把N个骰子扔在地上,所有骰子朝上一面的点数之和为S.输入N,打印出S的所有可能的值出现的概率. [分析] 典型的动态规划题目. 设n个骰子的和为s出现的次数记为f(n,s),其中n=[1-N ...

  10. codeforces B. The Fibonacci Segment 解题报告

    题目链接:http://codeforces.com/problemset/problem/365/B 题目意思:简单来说,就是要找出最长的斐波纳契长度. 解决的方法不难,但是要注意更新左区间和右区间 ...