node工具--express
//使用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){....};
node工具--express的更多相关文章
- Node.js Express 框架
Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP ...
- Windows下Node.js+Express+WebSocket 安装配置
Linux参考: Linux安装Node.js 使用Express搭建Web服务器 Node.js是一个Javascript运行环境(runtime).实际上它是对Google V8引擎进行了封装.V ...
- Node 之 Express 学习笔记 第一篇 安装
最近由于工作不忙,正好闲暇时间学学基于 node 的 web开发框架. 现在关于web开发框架除了Express 还有新出的 KOA以及其它一些. 但是想想还是先从 Express 入手吧.因为比较成 ...
- Node.js_06 express
一.初探 1 express是什么 Express.js 框架是目前最流行的node.js后端框架之一, 相当于jQuery和js之间的关系; Express 不对 Node.js 已有的特性进行二次 ...
- Node.js Express连接mysql完整的登陆注册系统(windows)
windows学习环境: node 版本: v0.10.35 express版本:4.10.0 mysql版本:5.6.21-log 第一部分:安装node .Express(win8系统 需要&qu ...
- Node.js Express 框架学习
转载:http://JavaScript.ruanyifeng.com/nodejs/express.html#toc0 感觉很牛的样子,不过觉得对初学者没太大用,里面很多例子用的api都没有详细的说 ...
- Nodejs学习笔记(六)--- Node.js + Express 构建网站预备知识
目录 前言 新建express项目并自定义路由规则 如何提取页面中的公共部分? 如何提交表单并接收参数? GET 方式 POST 方式 如何字符串加密? 如何使用session? 如何使用cookie ...
- React+Node.js+Express+mongoskin+MongoDB
首发:个人博客,更新&纠错&回复 采用React + Node.js + Express + mongoskin + MongoDB技术开发的一个示例,演示地址在这里,项目源码在这里. ...
- Node.js Express框架
Express 介绍 Express是一个最小的,灵活的Node.js Web应用程序框架,它提供了一套强大的功能来开发Web和移动应用程序. 它有助于基于Node Web应用程序的快速开发.下面是一 ...
随机推荐
- 用JSON-server模拟REST API(三) 进阶使用
用JSON-server模拟REST API(三) 进阶使用 前面演示了如何安装并运行 json server , 和使用第三方库真实化模拟数据 , 下面将展开更多的配置项和数据操作. 目录: 配置项 ...
- BI就是报表?
实际上,报表只是BI的一部分,虽然BI应用的结果通常需要通过报表来展示,但是,BI绝对不仅仅是报表.其实,大家对这些概念的理解,如同15年前的ERP一样.1998年,国内两大巨头金蝶与用友都开始宣称从 ...
- 3月20,html
html,表格的练习: 1,给图片做链接<br /><img src="200712211720988_2.jpg" usemap="A" w ...
- UNITY3D与iOS交互解决方案
原地址:http://bbs.18183.com/thread-456979-1-1.html 本帖最后由 啊,将进酒 于 2014-2-27 11:17 编辑 “授人以鱼,不如授人以渔”,以UNIT ...
- 北工大耿丹学院16级计科院3班C语言课程助教学期总结
很荣幸得到邹老师,周老师,以及北工大耿丹学院各位老师的认可,担任计科院3班C语言课程助教,班主任为李光杰老师,很感谢李老师一学期的帮助,使得我更好的担任助教一职.我班学生31名,很愉快的与同学们度过一 ...
- C++简单使用Jsoncpp来读取写入json文件
一.源码编译 C++操作json字符串最好的库应该就是jsoncpp了,开源并且跨平台.它可以从这里下载. 下载后将其解压到任意目录,它默认提供VS2003和VS2010的工程文件,使用VS2010可 ...
- Linux 日志文件utmp、wtmp、lastlog、messages
1.有关当前登录用户的信息记录在文件utmp中:==who命令 2.登录进入和退出纪录在文件wtmp中:==w命令 3.最后一次登录文件可以用lastlog命令察看: 4.messag ...
- 《ASP.NET1200例》<asp:DataList>分页显示图片
aspx页面代码 <asp:DataList ID="dlPhoto" runat="server" Height="137px" W ...
- C++类编程(一)const的使用
设计类时,考虑以下五点 1.构造函数初始化列表 2.函数该不该加const 3.参数传递尽量考虑用引用传递,考虑加不加const 4.返回用不用引用 5.数据尽量放在private,函数尽量放在pub ...
- 要“jquery”ScriptResourceMapping。请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping。”的解决办法。
1.在网站根目录下新建一scripts文件夹,向里边添加jquery-1.7.2.min.js和jquery-1.7.2.js(可根据自己需要使用不同的版本), 2.在根目录下添加全局应用程 ...