脚手架###

大多数项目都需要一定数量的“套路化”代码,所有可以创建一个通用的项目骨架,每次开始新项目时,只需复制这个骨架,或者说是模板。

RoR把这个概念向前推进了一步,它提供了一个可以自动生成脚手架的程序。相对于从一堆模板中作出选择,这种方式的优点是可以生成更复杂的框架;Express借鉴了RoR的这一做法,提供了一个生成脚手架的工具,从而可以让你开始一个新的Express项目。

开始创建一个项目###

初步配置####

  • 先给你的项目创建一个新目录,这将作为项目的根目录。
  • npm在package.json文件中管理项目的依赖项以及项目的元数据。要创建这个文件,最简单的办法是运行npm init

注意:如果你的package.json文件中没有指定一个存储库的URL,以及一个非空的README.md文件,那么你每次运行npm时都会看到警告信息。

  • 安装Express:npm install --save express; 运行npm install会把指定名称的包安装到node_modules目录下。如果你用了--save选项,它还会更新package.json文件。
  • 因为node_modules随时都可以用npm重新生成,所以我们不会把这个目录保存在我们的代码库中。为了确保不把它添加到代码库中, 我们可以创建一个.gitignore文件:node_modules
  • 接下来创建meadowlark.js文件,这是我们项目的入口。

大多数人会把主文件命名为app.js/index.js/server.js;不过考虑到可能的冲突,除非你用的托管服务或部署系统对程序主文件的名称有特定的要求,更倾向于按照项目命名主文件。npm init默认是用index.js,如果要使用其他的主文件名,要记得修改package.json文件中的main属性。

var express = require('express');

var app = express();
//这样设置可以在启动服务器前通过设置环境变量覆盖端口
app.set('port', process.env.PORT || 3000); app.get('/', function(req, res) {
res.type('text/plain');
res.send('Medaowlark Travel');
}); app.get('/about', function(req, res) {
res.type('text/plain');
res.send('About Medaowlark Travel');
}); //定制404页面
app.use(function(req, res) {
res.type('text/plain');
res.status(404);
res.end('404-Not Found');
});
//定制500页面
app.use(function(err, req, res, next) {
console.error(err.stack);
res.type('text/plain');
res.status(500);
res.send('500 - Server Error');
}); app.listen(app.get('port'), function() {
console.log('Express started on http://localhost:' +
app.get('port') + '; press Ctrl-C to terminate.');
});
  • 在Express文档中的app.VERB,VERB用来指代HTTP动词的(最常见的是“get” 和“post”)。这个方法有两个参数:一个路径和一个函数。**

    路由就是由这个路径定义的。app.VERB帮我们做了很多工作:它默认忽略了大小写或反斜杠,并且在进行匹配时也不考虑查询字符串。所以针对关于页面的路由对于/about、/About、/about/、/about?foo=bar、/about/?foo=bar等路径都适用。(就不需要之前那样处理路径了)
  • 这次使用的不是Node的res.end,而是换成了Express的扩展res.send
  • res.statusres.type替换了Node的res.writeHead。
  • 注意,我们对定制的404和500页面的处理与对普通页面的处理应有所区别:用的不是app.get,而是app.use

    app.use是Express添加中间件的一种方法,现在你可以把它看作处理所有没有路由匹配路径的处理器。

    注意,在Express中,路由和中间件的添加顺序至关重要。如果我们把404处理器放在所有路由上面,那首页和关于页面就不能用了,访问这些URL得到的都是404;下面的例子,第一个路径会覆盖其他路径
app.get('/about*',function(req,res){
// 发送内容....
})
app.get('/about/contact',function(req,res){
// 发送内容....
})
app.get('/about/directions',function(req,res){
// 发送内容....
})

视图和布局####

视图本质上是要发送给用户的东西。对网站而言,视图通常就是HTML;视图与静态资源(比如图片或CSS文件)的区别是它不一定是静态的:HTML可以动态构建,为每个请求提供定制的页面。

Express支持多种不同的视图引擎,如jade,ejs等,这里使用Handlebars

  • 安装 npm install --save express3-handlebars
  • 添加代码
var hanlebars = require('express3-handlebars').create({defaultLayout: 'main'});
app.engine('hanlebars', hanlebars.engine);
app.set('view engine', 'hanlebars');

这段代码创建了一个视图引擎,并对Express进行了配置,将其作为默认的视图引擎。接下来创建views目录,在其中创建一个子目录layouts。布局概念(有时也被称为“母版页”),在开发网站时,每个页面上肯定有一定数量的HTML是相同的,或者非常相近。在每个页面上重复写这些代码不仅非常繁琐,还会导致潜在的维护困境:如果你想在每个页面上做一些修改,那就要修改所有文件。布局可以解决这个问题,它为网站上的所有页面提供了一个通用的框架。

  • 创建一个views/layouts/main.handlebars文件
<!doctype html>
<html>
<head>
<title>Meadowlark Travel</title>
</head>
<body>
{{{body}}}
</body>
</html>

{{{body}}},这个表达式会被每个视图自己的HTML取代。在创建Handlebars实例时,我们指明了默认布局(defaultLayout:'main')。这就意味着除非你特别指明,否则所有视图用的都是这个布局。

  • 创建 views/home.handlebars:
<h1>Welcome to Meadowlark Travel</h1>
  • 创建 views/about.handlebars:
<h1>About Meadowlark Travel</h1>
  • 创建 views/404.handlebars:
<h1>404 - Not Found</h1>
  • 服务器错误页面,views/500.handlebars:
<h1>500 - Server Error</h1>

*接下来必须将使用这些视图的新路由替换旧路由:

app.get('/', function(req, res) {
res.render('home');
}); app.get('/about', function(req, res) {
res.render('about');
}); // 404 catch-all处理器(中间件)
app.use(function(req, res, next) {
res.status(404);
res.render('404');
});
// 500错误处理器(中间件)
app.use(function(err, req, res, next) {
console.error(err.stack);
res.status(500);
res.render('500');
});

视图引擎默认会返回text/html的内容类型和200的状态码。在catch-all处理器(提供定制的404页面)以及500处理器中,我们必须明确设定状态码。

视图和静态文件###

Express靠中间件处理静态文件和视图;现在只需了解中间件是一种模块化手段,它使得请求的处理更加容易。

*static中间件可以将一个或多个目录指派为包含静态资源的目录,其中的资源不经过任何特殊处理直接发送到客户端。

在项目目录下创建名为public的子目录 (因为这个目录中的所有文件都会直接对外开放,所以我们称这个目录为public)。接下来,你应该把static中间件加在所有路由之前:

app.use(express.static(__dirname + '/public'));

static中间件相当于给你想要发送的所有静态文件创建了一个路由,渲染文件并发送给客户端。

视图中的动态内容###

视图真正的强大之处在于它可以包含动态信息。我们在meadowlark.js中定义一个幸运饼干数组:

var fortunes = [
"Conquer your fears or they will conquer you.",
"Rivers need springs.",
"Do not fear what you don't know.",
"You will have a pleasant surprise.", "Whenever possible, keep it simple.",
];

修改视图(/views/about.handlebars)以显示幸运饼干:

<p>Your fortune for the day:</p>
<blockquote>{{fortune}}</blockquote>

修改路由/about,随机发送幸运饼干:

app.get('/about', function(req, res) {
var randomFortune = fortunes[Math.floor(Math.random() * fortunes.length)];
res.render('about', { fortune: randomFortune });
});

express-2 express介绍的更多相关文章

  1. express node 框架介绍

    开篇先声明一个重点: 就是论文件模块的重要性,之前我一直以为 fs 模块不重要,后来遇到了问题,才发现我之前的自以为是是多么愚蠢的一件事,我现在知道了 fs 模块的重要性 fs 模块:用于对文件的操作 ...

  2. express - ejs使用介绍

    http://blog.sina.com.cn/s/blog_ad0672d60101l2ml.html 1.express中使用ejs var express = require('express' ...

  3. Node.js Express 框架 Express

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

  4. 【node.js】本地模式安装express:'express' 不是内部或外部命令,也不是可运行的程序或批处理文件。

    今天闲来无事想起了node.js,因此到网上下载了一个node.js的安装程序进行安装.其中: 安装程序:node-v0.11.13-x64.msi PC系统:Windows 7 自定义安装路径:D: ...

  5. express学习-express搭建后台

    前言:本文是纯用node express做一个后端服务的教程,并不等同于express官网的入门教程,本文也并不涉及任何高级的Node服务端性能优化等知识. 本文是在已经看过express官方入门指南 ...

  6. 浅析express以及express中间件

    一.express: 1.express: Express是什么? Express是基于node.js平台的web应用开发框架: 作用:可以实现快速搭建骨架: 优点:开发web应用更加方便,更加快捷. ...

  7. IISExpress.无法启动IIS Express Web 服务器.Starting IIS Express... IIS Express is running

    x 提示: 无法启动IIS Express Web 服务器. 来自IIS Express的输出: Starting IIS Express... IIS Express is running 总结: ...

  8. 用npm安装express后express命令找不到

    Windows 平台加了 npm install -g express 也不行AppData\Roaming\npm 下面没有 express.bat 解决办法: sudo npm install - ...

  9. Mac环境下装node.js,npm,express;(包括express command not found)

    1. 下载node.js for Mac 地址: http://nodejs.org/download/ 直接下载 pkg的,双击安装,一路点next,很容易就搞定了. 安装完会提醒注意 node和n ...

  10. 夺命雷公狗—express—1—express的配置方法和目录结构分析

随机推荐

  1. CCF 最大的矩形

    问题描述 试题编号: 3 试题名称: 最大的矩形 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个 ...

  2. MyBatis之多表关联查询

    1使用resultType.ResultMap处理返回结果 处理返回结果 resultType:指定返回值结果的完全限定名,处理多表查询的结果. 多表查询需要定义vo封装查询的结果. 需求:查询部门和 ...

  3. Google earth

    装了Google earth之后,需要联网,才能放缩看不同精细程度的场景,除非你之前看过,在你自己的缓存中有存储. Google earth有自己的server,我们交互化的时候,server传数据给 ...

  4. chaper3_exercise_Uva1585_score

    #include<iostream> #include<string> using namespace std; int main(void) { , j = ; string ...

  5. grep如何忽略.svn目录,以及如何忽略多个目录

    grep如何忽略.svn目录,以及如何忽略多个目录 这是我在网上看到的文章,不过里面还有问题,我的不支持,需要更换架包 grep -r 'function_name' * (*表示当前目录下所有文件, ...

  6. C/C++中调用python文件

    1.将python27安装目录下include.libs文件夹拷贝至Demo程序目录. 2.Demo项目设置包含Python.h.python27.lib); (因为安装python27的时候,pyt ...

  7. 关于内存管理/set/get方法

    MRC状态下 1 任何继承NSObject的对象,存放于堆控件中,都需要手动管理内存 .2 基本数据类型放到栈中,对象放到堆空间中,内存是有系统管理的.(int\float\enum\struct) ...

  8. CodeForces 282C(位运算)

    C. XOR and OR time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  9. jQuery中读取json文件示例代码

    json文件是一种轻量级的数据交互格式.一般在jquery中使用getJSON()方法读取,具体示例代码如下,感兴趣的朋友可以参考下哈,希望可以帮助到你   json文件是一种轻量级的数据交互格式.一 ...

  10. CLR via C#(15)--String,熟悉而又陌生

    好久没写文章了,再拿起这本书,学习加分享,乐趣无穷啊.这两天看了写关于字符串的知识,从学写代码的时候开始,我们就基本天天跟String打交道,对它再熟悉不过了.但是仔细看看,还是有一种拨开云雾的感觉, ...