在确认已经安装了node以后(下载), 在你的机器上建立一个目录,让咱们来开始你的第一个应用程序吧javascript
$ mkdir hello-world
在这个目录中你首先得定义一下你的应用程序“包”文件,它和其它的node程序包是同样的。 你得在这个目录中建立一个package.json文件,在里面express做为一个依赖。 你也可使用 npm info express version 来获取express最新的版本号, 最好使用最新的版本号而不是下面的3.x,这样新出的功能就不会让你感受到奇怪了。css
{
"name": "hello-world", "description": "hello world test app", "version": "0.0.1", "private": true, "dependencies": { "express": "3.x" } }
如今package.json文件已经准备好了,使用npm(1) 安装依赖, 这里的依赖仅仅是Express。html
$ npm install
当npm完成后,Express 3.x 和它的依赖就安装到你的 ./node_modules 目录里了。 你能够经过 npm ls 来确认一下,它会把Express 和它的依赖展现成下面的树状结构。前端
$ npm ls
hello-world@0.0.1 /private/tmp └─┬ express@3.0.0beta7 ├── commander@0.6.1 ├─┬ connect@2.3.9 │ ├── bytes@0.1.0 │ ├── cookie@0.0.4 │ ├── crc@0.2.0 │ ├── formidable@1.0.11 │ └── qs@0.4.2 ├── cookie@0.0.3 ├── debug@0.7.0 ├── fresh@0.1.0 ├── methods@0.0.1 ├── mkdirp@0.3.3 ├── range-parser@0.0.4 ├─┬ response-send@0.0.1 │ └── crc@0.2.0 └─┬ send@0.0.3 └── mime@1.2.6
如今咱们来写真正的代码了!建立一个名为app.js 或者 server.js的文件,叫什么看你我的喜爱了。 载入express 而后使用代码 express()建立一个新的应用程序:java
var express = require('express'); var app = express();
在这个应用程序实例里,你能够经过 app.VERB()定义路由,下面的例子是"GET /"返回 "Hello World" 字符串。 req 和 res 对象是和node原生提供给你的一致的,你也能够执行 res.pipe(), req.on('data', callback) 等任何事情在没有Express的状况下能够作的事情。node
app.get('/hello.txt', function(req, res){ var body = 'Hello World'; res.setHeader('Content-Type', 'text/plain'); res.setHeader('Content-Length', body.length); res.end(body); });
Express 给这些对象加了一个封装好的方法,好比 res.send(), 它会帮你设置Content-Length:nginx
app.get('/hello.txt', function(req, res){ res.send('Hello World'); });
如今咱们经过执行 app.listen() 来绑定并监听链接。 它接受的参数和nodenet.Server#listen()的方法一致:git
app.listen(3000); console.log('Listening on port 3000');
Express 附带了一个能够执行的文件,这里命名为 express(1). 若是你使用npm全局安装的express, 在你的机器任何位置它都是可用的:github
$ npm install -g express
这个工具提供了一个很是简单的生成一个程序骨架的功能,可是它也有局限,好比它只支持不多的几个模板引擎。 而事实上Express几乎支持全部的为node所建的模板引擎。 使用 --help查看一下帮助:redis
Usage: express [options] Options: -h, --help 输出帮助信息 -V, --version 输出版本号 -s, --sessions 添加 session 支持 -e, --ejs 添加 ejs 模板引擎支持 (默认为jade) -J, --jshtml 添加 jshtml模板引擎支持 (默认为jade) -H, --hogan 添加 hogan.js模板引擎支持 -c, --css 样式 <引擎> 支持 (less|stylus) (默认为css) -f, --force 强制在非空目录执行
若是你想生成一个支持EJS, Stylus, 和session的应用程序,只须要简单的执行下面的命令:
$ express --sessions --css stylus --ejs myapp create : myapp create : myapp/package.json create : myapp/app.js create : myapp/public create : myapp/public/javascripts create : myapp/public/images create : myapp/public/stylesheets create : myapp/public/stylesheets/style.styl create : myapp/routes create : myapp/routes/index.js create : myapp/views create : myapp/views/index.ejs install dependencies: $ cd myapp && npm install run the app: $ node app
和其它node程序同样,你必须安装依赖:
$ cd myapp
$ npm install
而后让咱们运行它吧!
$ node app
这些就是一个简单的应用程序建立和运行的全部步骤。 记住Express没有限定任何的目录结构,这只是一个方便你工做的基本结构。 若是你想获得更多怎么组织目录结构选择,能够查看github上的示例。
错误处理的中间件和普通的中间件定义是同样的, 只是它必须有4个形参,这是它的形式: (err, req, res, next):
app.use(function(err, req, res, next){ console.error(err.stack); res.send(500, 'Something broke!'); });
通常来讲非强制性的错误处理通常被定义在最后,下面的代码展现的就是放在别的app.use() 以后:
app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(function(err, req, res, next){ // logic });
在这些中间件里的响应是能够任意定义的。只要你喜欢,你能够返回任意的内容,譬如HTML页面, 一个简单的消息,或者一个JSON字符串。
对于一些组织或者更高层次的框架,你可能会像定义普通的中间件同样定义一些错误处理的中间件。 假设你想定义一个中间件区别对待经过XHR和其它请求的错误处理,你能够这么作:
app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(logErrors); app.use(clientErrorHandler); app.use(errorHandler);
一般logErrors用来纪录诸如stderr, loggly, 或者相似服务的错误信息:
function logErrors(err, req, res, next) { console.error(err.stack); next(err); }
clientErrorHandler 定义以下,注意错误很是明确的向后传递了。
function clientErrorHandler(err, req, res, next) { if (req.xhr) { res.send(500, { error: 'Something blew up!' }); } else { next(err); } }
下面的errorHandler "捕获全部" 的异常, 定义为:
function errorHandler(err, req, res, next) { res.status(500); res.render('error', { error: err }); }
这一小节咱们讲解一个小而全的应用程序,它经过Redis记录在线用户数。 首先你须要建立一个package.json 文件,包含两个依赖, 一个是redis 客户端,另外一个是Express。 另外须要确认你安装了redis, 能够能过执行$ redis-server来确认:
{
"name": "app", "version": "0.0.1", "dependencies": { "express": "3.x", "redis": "*" } }
接下来你须要你建立一个应用程序,和一个redis链接:
var express = require('express'); var redis = require('redis'); var db = redis.createClient(); var app = express();
接下来是纪录用户在线的中间件。 这里咱们使用sorted sets, 它的一个好处是咱们能够查询最近N毫秒内在线的用户。 咱们经过传入一个时间戳来看成成员的"score"。 注意咱们使用 User-Agent 做为一个标识用户的id。
app.use(function(req, res, next){ var ua = req.headers['user-agent']; db.zadd('online', Date.now(), ua, next); });
下一个中间件是经过zrevrangebyscore来查询上一分钟在线用户。 咱们将能获得从当前时间算起在60,000毫秒内活跃的用户。
app.use(function(req, res, next){ var min = 60 * 1000; var ago = Date.now() - min; db.zrevrangebyscore('online', '+inf', ago, function(err, users){ if (err) return next(err); req.online = users; next(); }); });
最后咱们来使用它,绑定到一个端口!这些就是这个程序的一切了,在不一样的浏览器里访问这个应用程序,你会看到计数的增加。
app.get('/', function(req, res){ res.send(req.online.length + ' users online'); }); app.listen(3000);
在Express的前端使用一个反向代理,好比 Varnish 或者 Nginx是很是常见的,它不须要额外的配置。 在经过app.enable('trust proxy')激活了"trust proxy" 设置后, Express 就会知道它在一个代理的后面,X-Forwarded-* 必须被信任, 一般状况下这些头是很容易被假装的。
使用了这个设置后会有一些很棒的小变化。 首先由代理设置的X-Forwarded-Proto 会告诉程序它是https 仍是http 。 这个值会影响req.protocol.
第二个变化是 req.ip 和 req.ips 的值会被X-Forwarded-For列表里的地址取代。
英文地址:http://expressjs.com/api.html