来源:自学PHP网 时间:2014-12-14 21:15 作者: 阅读:次
[导读] Express 是一个简洁而灵活的 node.js Web应用框架, 提供一系列强大特性帮助你创建各种Web应用。下面我们将逐步分析下,各位不要轻易离开...
安装了node(下载)之后, 在你的机器上创建一个目录,开始你的第一个应用程序。 $ mkdir hello-world 在这个目录中你将定义应用程序“包”,这和任何其他node的包没有什么不同。文件目录中的json文件,明确定义了一个依赖项。你可以用npm命令获取express最新版本,你喜欢这样做,而不是安装“3.x”以外的版本,以防止任何未知的惊喜。 { "name": "hello-world", "description": "hello world test app", "version": "0.0.1", "private": true, "dependencies": { "express": "3.x" } } 现在,您已经有了一个包。json文件在这个目录你可以使用npm(1)安装这种依赖关系,在这种情况下只需要输入: $ npm install 一旦npm完成,你就会在/node_modules目录中存有一个你依赖的Express 3.x。您可以用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()创建一个新的应用程序: var express = require('express'); var app = express(); 新应用程序实例可以通过app.VERB()开始定义路线,在这种情况下,通过“Hello World”字符串回应“GET/”请求。req和res是提供给您的完全相同的node对象,因此你可能会调用res.pipe(),req.on('data', callback) 和其他你会做的与Express无关的事情。 Express增强这些对象为你提供更高层次的接口如res.send(),除此之外为你添加内容长度: app.get('/hello.txt', function(req, res){ res.send('Hello World'); }); 现在为连接调用app.listen()方法绑定和监听,接受相同的参数作为节点的net.Server #listen(): var server = app.listen(3000, function() { console.log('Listening on port %d', server.address().port); }); 使用express(1)来生成应用程序 Express团队维护便捷的项目生成器,命名为express-generator(1)。如果你用npm全局安装express-generator,那么你可以从你电脑的任何地方访问到它: $ npm install -g express-generator 这个工具提供了一种简单的方法来得到一个应用程序框架,但范围有限,例如,它只支持几个模板引擎,而Express自己事实上支持为node建立任何网站框架模板。可通过help查看: Usage: express [options] Options: -h, --help output usage information -V, --version output the version number -e, --ejs add ejs engine support (defaults to jade) -H, --hogan add hogan.js engine support -c, --css add stylesheet support (less|stylus|compass) (defaults to plain css) -f, --force force on non-empty directory 如果你想生成一个任何情况都支持的应用程序您只需要简单地执行:: $ express --css stylus 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.jade create : myapp/views/layout.jade install dependencies: $ cd myapp && npm install run the app: $ DEBUG=myapp node app 像任何其他node的应用程序,您必须安装以下的依赖关系: 然后让我们开始吧。 $ npm start 这是所有你需要让一个简单的应用程序启动并运行。记住,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()后,其调用如下所示: var bodyParser = require('body-parser'); var methodOverride = require('method-override'); app.use(bodyParser()); app.use(methodOverride()); app.use(app.router); app.use(function(err, req, res, next){ // logic }); 在这些中间件的响应是完全任意的。您可能希望回应一个HTML错误页面,一个简单的消息,一个JSON字符串,或任何其他你喜欢的回应。 为构建有组织的和更高层次的框架,你可以定义几个这些错误处理中间件,就像你会定义普通中间件。例如假设您想为XHR请求定义一个错误处理器,除了这些之外,你可能会做的事如下: var bodyParser = require('body-parser'); var methodOverride = require('method-override'); app.use(bodyParser()); app.use(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跟踪用户在线数量。首先创建一个包。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(); 接下来的中间件跟踪在线用户。在这里我们将使用排序集,这样我们通过可以redis查询在线用户,仅需要N毫秒。我们通过时间戳作为成员的“在线标准”。注意, 这里我们使用user-agent字符串代替通常的用户id。 app.use(function(req, res, next){ var ua = req.headers['user-agent']; db.zadd('online', Date.now(), ua, next); }); 下一个中间件是在最后一刻使用zrevrangebyscore来获取最大在线用户数量,我们总是得到最近在线的用户,他的上限是当前时间戳减去60000毫秒。 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(); }); }); 最后,我们通过一个url使用它,并绑定到一个端口!这就完了,在一个新浏览器访问这个应用程序,您会看到在线人数增加。 app.get('/', function(req, res){ res.send(req.online.length + ' users online'); }); app.listen(3000); Expree的反向代理 在反向代理背后使用Expree,如Varnish 或Nginx是微不足道的,然而它需要配置。通过启用“信任代理”设置app.enable(“trust proxy”),Express有一些反向代理的技巧,X-Forwarded - *头字段可能是可信的,否则他们可能很容易被欺骗。 启用该设置有一些微妙的影响。第一个是X-Forwarded-Proto可能被反向代理设定,告诉app那是https或者只是简单的http。这个值由req.protocol反射。 第二个变化是req.ip和req.ips值将填充X-Forwarded-For地址的列表。 调试Express Express内部使用调试模块记录路径匹配和应用程序模式的信息。要看到这条信息,只要简单设置调试环境变量为express:*,当启动应用程序后,你将在控制台看以调试信息。 $ DEBUG=express:* node ./bin/www 运行这个hello world示例将打印以下内容: express:application booting in development mode +0ms express:router defined get /hello.txt +0ms express:router defined get /hello.txt +1ms 另外, 表达可执行(生成器)生成的程序也使用调试模块,默认作用域是my-application调试命名空间。 你可以用以下命令启用这些调试语句 $ DEBUG=my-application node ./bin/www 关于调试的更多信息,请参见调试 指南 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com