Express.JS使用详解

安装了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

关于调试的更多信息,请参见调试 指南

(0)

相关推荐

  • javascript中expression的用法整理

    小哥我最近在学习javaScript, 学到regular expression的时候见知识点有些杂乱,所以特别写篇博客做个总结. 定义 在javascript里定义reg exp有两种方法: 1) 用new exp : var exp1 = new exp("abc"); 2) 直接在两个/中间放pattern: var exp2 = /abc/; //注意..没有双引号哟, 加了就成string了 特殊字符 目测特殊字符和perl的是一样的..直接拿来用就好 \d Digit ch

  • Express作者TJ告别Node.js奔向Go

    首先这是一篇翻译自TJ 的 Farewell Node.js  ,我本人在看完这这篇文章之后确实是受到了一些冲击,但我并不认同作者的某些看法,比如我认为 Node.js 的package register 是其许多优势之一,反而 Go 在这方面却略显匮乏. 由于个人水平所限,在翻译的时候有许多不懂的地方,我也去作者博客.stackoverflow 上问了一些问题,获得了解答.翻译仍有许多不到位的地方,希望能获得指出意见. PS.  作为一位Node.js 的入门菜鸟,感谢TJ 的付出,一路走好.

  • node.js Web应用框架Express入门指南

    一.安装 复制代码 代码如下: $ npm install express 或者在任何地方使用可执行的 express(1) 安装: 复制代码 代码如下: \# 译注:强烈建议这种方式$ npm install -g express 二.快速上手 最快上手 express 的方法是利用可执行的 express(1) 来生成一个应用,如下所示: 创建一个 app: 复制代码 代码如下: $ npm install -g express$ express /tmp/foo && cd /tmp

  • nodejs教程 安装express及配置app.js文件的详细步骤

    安装express.js 如果你安装了npm,安装变得很简单,只需要在终端中运行下面的代码即可: 复制代码 代码如下: npm install express -gd -g代表安装到NODE_PATH的lib里面,而-d代表把相依性套件也一起安装.如果沒有-g的话会安装目前所在的目录(会建立一个node_modules的文件夹),你可以透过以下指令来比较两者的不同: 复制代码 代码如下: npm list -gnpm list 如果没有npm,那么我可以使用github来git下来最新的expr

  • NodeJS Express框架中处理404页面一个方式

    在用 Express 的时候,路由是我最困惑的事之一.知道用 app.get('*') 可以处理所有页面,但这样除了自定义的其他路由外,静态文件是被忽略的.最近在写一个小工具的时候,找到了一个解决方案: 复制代码 代码如下: var express = require('express'),    router = require('./routes'); var app = module.exports = express.createServer(); // Configurationapp

  • 固定表格行列(expression)在IE下适用

    这是一种在IE下适用的固定行列的方法.其具体代码如下: 复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title> New Document </title> <style> .FixedTitleRow { position: relative; top: expression(th

  • NodeJS框架Express的模板视图机制分析

    模板引擎 Express支持许多模板引擎,常用的有: haml 的实现Haml haml.js 接替者,同时也是Express的默认模板引擎Jade 嵌入JavaScript模板EJS 基于CoffeeScript的模板引擎CoffeeKup 的NodeJS版本jQuery模板引擎 视图渲染(view randering) 视图的文件名默认需遵循"<name>.<engine>"的形式,这里<engine>是要被加载的模块的名字.比如视图layout

  • Express.JS使用详解

    安装了node(下载)之后, 在你的机器上创建一个目录,开始你的第一个应用程序. $ mkdir hello-world 在这个目录中你将定义应用程序"包",这和任何其他node的包没有什么不同.文件目录中的json文件,明确定义了一个依赖项.你可以用npm命令获取express最新版本,你喜欢这样做,而不是安装"3.x"以外的版本,以防止任何未知的惊喜. { "name": "hello-world", "desc

  • Jquery揭秘系列:ajax原生js实现详解(推荐)

    讲到ajax这个东西,我们要知道两个对象XMLHTTPRequest和ActiveXObject ,提供了对 HTTP 协议的完全的访问,包括做出 POST 和 HEAD 请求以及普通的 GET 请求的能力.可以同步或异步返回 Web 服务器的响应,并且能以文本或者一个 DOM 文档形式返回内容.XMLHTTPRequest基本上算是标准化了,兼容大部分浏览器ActiveXObject这玩儿意儿是微软的东西,所以是为了兼容IE版本,我们用的只是它的xmlHTTP功能. 为了功能的明确和清晰,我们

  • Vue.js用法详解

    vue.js 教程 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架. Vue 只关注视图层, 采用自底向上增量开发的设计. Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. Vue 学习起来非常简单,本教程基于 Vue 2.1.8 版本测试. 前  言 前段时间为了一个数据查询的项目自学了Vue,感觉这款框架还是很不错的,今天就整理整理这个框架如何使用,希望对正在学这个框架的小伙伴有所帮助~ 首先,我们先来了解一下Vue: V

  • 基于webpack.config.js 参数详解

    webpack.config.js文件通常放在项目的根目录中,它本身也是一个标准的Commonjs规范的模块. var webpack = require('webpack'); module.exports = { entry: [ 'webpack/hot/only-dev-server', './js/app.js' ], output: { path: './build', filename: 'bundle.js' }, module: { loaders: [ { test: /\.

  • Node.js API详解之 querystring用法实例分析

    本文实例讲述了Node.js API详解之 querystring用法.分享给大家供大家参考,具体如下: Node.js API详解之 querystring querystring模块提供了一些实用函数,用于解析与格式换URL查询字符串 通过 const querystring = require('querystring'); 的方式引用querystrings模块 目录: querystring.escape(str) querystring.unescape(str) querystri

  • Node.js API详解之 string_decoder用法实例分析

    本文实例讲述了Node.js API详解之 string_decoder用法.分享给大家供大家参考,具体如下: string_decoder 模块提供了一个 API,用于把 Buffer 对象解码成字符串. 对于参数末尾不完整的多字节字符,string_decoder会将其保存在内部的buffer中,当再次解码时,补充到参数开头. 通过 const { StringDecoder } = require('string_decoder'); 的方式引用string_decoder模块. 目录:

  • Node.js API详解之 tty功能与用法实例分析

    本文实例讲述了Node.js API详解之 tty功能与用法.分享给大家供大家参考,具体如下: tty 可以理解为终端的意思.tty 模块提供终端相关的接口,用来获取终端的行数列数等. 通过 const tty = require('tty'); 的方式引用 tty 模块 process.stdout.isTTY 说明: 此属性位于 process 模块,用来判断 Node.js 是否运行在一个 TTY 环境中 demo: console.log(process.stdout.isTTY) //

  • Node.js API详解之 console模块用法详解

    本文实例讲述了Node.js API详解之 console模块用法.分享给大家供大家参考,具体如下: console模块简介 说明: console 模块提供了一个简单的调试控制台,类似于 Web 浏览器提供的 JavaScript 控制台. console 模块导出了两个特定的组件: 一个 Console 类,包含 console.log() . console.error() 和 console.warn() 等方法,可以被用于写入到任何 Node.js 流. 一个全局的 console 实

  • Node.js API详解之 util模块用法实例分析

    本文实例讲述了Node.js API详解之 util模块用法.分享给大家供大家参考,具体如下: Node.js API详解之 util util 模块主要用于支持 Node.js 内部 API 的需求.提供了大部分实用工具. 通过 const util = require('util'); 的方式引用util模块 util.callbackify(original) 说明: original:传递一个 async 函数,或者是一个返回Promise的异步函数. callbackify会返回一个方

  • Node.js API详解之 timer模块用法实例分析

    本文实例讲述了Node.js API详解之 timer模块用法.分享给大家供大家参考,具体如下: Node.js API详解之 timer timer 模块暴露了一个全局的 API,用于在某个未来时间段调用调度函数. 因为定时器函数是全局的,所以使用该 API 无需调用 require('timers'). Node.js 中的计时器函数实现了与 Web 浏览器提供的定时器类似的 API, 它使用了一个不同的内部实现,它是基于 Node.js 事件循环构建的. setImmediate(call

随机推荐