脚手架###

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

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. WP开发资源

    wp开发:连续两次点击返回键退出程序的设计: http://hi.baidu.com/youngytj/item/6be317719cc371306cc37ce4 X http://www.cnblo ...

  2. Gson解析复杂的json数据

    最近在给公司做一个直播APK的项目,主要就是通过解析网络服务器上的json数据,然后将频道地址下载下来再调用Android的播放器进行播放,原先本来打算使用普通的json解析方法即JsonObject ...

  3. jquery 中的一写常用方法

    $('form').submit(); // 表单提交 window.parent.location.reload(); // 子窗口刷新父页面 window.location.reload(); / ...

  4. ssh自动登陆

    突然碰到有人问ssh再传输密钥时候能不手动输入密码,由于没有碰到过这种情况,所以查了一下发现可以用sshpass做到. sshpass [参数] ssh命令: 参数: -p password  #将参 ...

  5. iOS -类目,延展,协议

    1.类目 类目就是为已存在的类添加新的方法.但是不能添加实例变量.比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现. @interface NSMutableArray ( ...

  6. UICollectionView cellForItemAtIndexPath 方法不走

    在storyboard 中 UICollectionView cellForItemAtIndexPath not called 被坑了好久,各种问题点查找,终于解决了 解决办法: self.auto ...

  7. iOS 文档分享相关

    在非系统预览情况下  指定文件打开系统分享菜单 NSString *savedPath = [NSHomeDirectory() stringByAppendingString:[NSString s ...

  8. Hive介绍、安装(转)

    1.Hive介绍 1.1 Hive介绍 Hive是一个基于Hadoop的开源数据仓库工具,用于存储和处理海量结构化数据.它是Facebook 2008年8月开源的一个数据仓库框架,提供了类似于SQL语 ...

  9. Quartus II9.0 使用中文输入的方法

      Quartus II可以用中文了 我们都知道高版本的quartus里面不支持中文,就连最新版的10.0也不支持,还好找到了一种方法,和大家分享一下: 具体步骤:quartus ——tools——o ...

  10. WiFi基本知识

    转自:http://blog.csdn.net/myarrow/article/details/7930131 1. IE802.11简介 标准号 IEEE 802.11b IEEE 802.11a ...