Node.js之express生成器express-generator

来源:互联网 发布:四川房卡麻将源码 编辑:程序博客网 时间:2024/05/01 05:51

安装 Express 并将其保存到依赖列表中:

$ npm install express --save

如果只是临时安装 Express,不想将它添加到依赖列表中,只需略去 –save 参数即可:

$ npm install express

安装 Node 模块时,如果指定了 –save 参数,那么此模块将被添加到 package.json 文件中 dependencies 依赖列表中。 然后通过 npm install 命令即可自动安装依赖列表中所列出的所有模块。

Hello world 实例

继续之前请务必按照 安装 章节执行了所有的前期准备工作。

接下来,我们一起创建一个基本的 Express 应用。

注意:这里所创建是一个最最简单的 Express 应用,并且仅仅只有一个文件 — 和通过 Express 应用生成器 所创建的应用完全不一样,Express 应用生成器所创建的应用框架包含多个 JavaScript 文件、Jade 模板和针对不同用途的子目录。

进入 myapp 目录,创建一个名为 app.js 的文件,然后将下列代码复制进去:

var express = require('express');var app = express();app.get('/', function (req, res) {  res.send('Hello World!');});var server = app.listen(3000, function () {  var host = server.address().address;  var port = server.address().port;  console.log('Example app listening at http://%s:%s', host, port);});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

上面的代码启动一个服务并监听从 3000 端口进入的所有连接请求。他将对所有 (/) URL 或 路由 返回 “Hello World!” 字符串。对于其他所有路径全部返回 404 Not Found

req (请求) 和 res (响应) 与 Node 提供的对象完全一致,因此,你可以调用 req.pipe()、req.on('data', callback) 以及任何 Node 提供的方法。
  • 1
  • 1

通过如下命令启动此应用:

$ node app.js

然后在浏览器中打开 http://localhost:3000/ 并查看输出结果。

Express 应用生成器

通过应用生成器工具 express 可以快速创建一个应用的骨架。

通过如下命令安装:

$ npm install express-generator -g
  • 1
  • 2
  • 1
  • 2

-h 选项可以列出所有可用的命令行选项:

$ express -h  Usage: express [options] [dir]  Options:    -h, --help          output usage information    -V, --version       output the version number    -e, --ejs           add ejs engine support (defaults to jade)        --hbs           add handlebars engine support    -H, --hogan         add hogan.js engine support    -c, --css <engine>  add stylesheet <engine> support (less|stylus|compass|sass) (defaults to plain css)        --git           add .gitignore    -f, --force         force on non-empty directory
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

例如,下面的示例就是在当前工作目录下创建一个命名为 myapp 的应用。

$ express myapp   create : myapp   create : myapp/package.json   create : myapp/app.js   create : myapp/public   create : myapp/public/javascripts   create : myapp/public/images   create : myapp/routes   create : myapp/routes/index.js   create : myapp/routes/users.js   create : myapp/public/stylesheets   create : myapp/public/stylesheets/style.css   create : myapp/views   create : myapp/views/index.jade   create : myapp/views/layout.jade   create : myapp/views/error.jade   create : myapp/bin   create : myapp/bin/www
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

然后安装所有依赖包:

$ cd myapp $ npm install
  • 1
  • 2
  • 1
  • 2

启动这个应用(MacOS 或 Linux 平台):

$ DEBUG=myapp npm start

Windows 平台使用如下命令:

> set DEBUG=myapp & npm start
  • 1
  • 1

然后在浏览器中打开 http://localhost:3000/ 网址就可以看到这个应用了。i

通过 Express 应用生成器创建的应用一般都有如下目录结构:

.├── app.js├── bin│   └── www├── package.json├── public│   ├── images│   ├── javascripts│   └── stylesheets│       └── style.css├── routes│   ├── index.js│   └── users.js└── views    ├── error.jade    ├── index.jade    └── layout.jade7 directories, 9 files
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

通过 Express 应用生长期创建应用只是众多方法中的一种。你可以不使用它,也可以修改它让它符合你的需求,都是开源的嘛!

一个简单的 Express 路由

这篇教程只是对 Express 路由做一个简单的介绍。路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET、POST 等)组成的,涉及到应用如何响应客户端对某个网站节点的访问。

每一个路由都可以有一个或者多个处理器函数,当匹配到路由时,这个/些函数将被执行。

路由的定义由如下结构组成:app.METHOD(PATH, HANDLER)。其中,app 是一个 express 实例;METHOD 是某个 HTTP 请求方式中的一个;PATH 是服务器端的路径;HANDLER 是当路由匹配到时需要执行的函数。

本教程假定已经存在一个命名为 app 的 express 实例了,并且应用程序是运行状态。如果你还不熟悉如何创建一个应用并使其运行,请参考 Hello world 实例

下面的代码展示了几个路由实例:

// 对网站首页的访问返回 "Hello World!" 字样app.get('/', function (req, res) {  res.send('Hello World!');});// 网站首页接受 POST 请求app.post('/', function (req, res) {  res.send('Got a POST request');});// /user 节点接受 PUT 请求app.put('/user', function (req, res) {  res.send('Got a PUT request at /user');});// /user 节点接受 DELETE 请求app.delete('/user', function (req, res) {  res.send('Got a DELETE request at /user');});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

关于路由的详细资料,请参考 路由指南 章节。http://www.expressjs.com.cn/guide/routing.html

利用 Express 托管静态文件

通过 Express 内置的 express.static 可以方便地托管静态文件,例如图片、CSS、JavaScript 文件等。

将静态资源文件所在的目录作为参数传递给 express.static 中间件就可以提供静态资源文件的访问了。例如,假设在 public 目录放置了图片、CSS 和 JavaScript 文件,你就可以:

app.use(express.static('public'));

现在,public 目录下面的文件就可以访问了。

http://localhost:3000/images/kitten.jpghttp://localhost:3000/css/style.csshttp://localhost:3000/js/app.jshttp://localhost:3000/images/bg.pnghttp://localhost:3000/hello.html
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

所有文件的路径都是相对于存放目录的,因此,存放静态文件的目录名不会出现在 URL 中。

如果你的静态资源存放在多个目录下面,你可以多次调用 express.static 中间件:

app.use(express.static('public'));app.use(express.static('files'));

访问静态资源文件时,express.static 中间件会根据目录添加的顺序查找所需的文件。

如果你希望所有通过 express.static 访问的文件都存放在一个“虚拟(virtual)”目录(即目录根本不存在)下面,可以通过为静态资源目录指定一个挂载路径的方式来实现,如下所示:

挂载路径的方式参考:http://www.expressjs.com.cn/4x/api.html#app.use

app.use('/static', express.static('public'));

现在,你就爱可以通过带有 “/static” 前缀的地址来访问 public 目录下面的文件了。

http://localhost:3000/static/images/kitten.jpghttp://localhost:3000/static/css/style.csshttp://localhost:3000/static/js/app.jshttp://localhost:3000/static/images/bg.pnghttp://localhost:3000/static/hello.html
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

Express 常见问题

我的应用该如何组织?

对于这个问题其实没有一个确定的答案。这要根据你的应用的规模和参与开发的团队来确定。为了尽可能灵活,Express 自身是并没有硬性要求应用结构是哪一种的。

根据你的需求,可以把路由和其他应用相关的业务逻辑存放在任意多个文件和任意目录中。下面推荐的实例或许对你能有一些启发:

  • Route listings

https://github.com/strongloop/express/blob/4.13.1/examples/route-separation/index.js#L32-47

  • Route map

https://github.com/strongloop/express/blob/4.13.1/examples/route-map/index.js#L52-L66

  • MVC style controllers

https://github.com/strongloop/express/tree/master/examples/mvc

另外,这里还有一些第三方 Express 扩展简化了这种组织方式:


  • Resourceful routing 

https://github.com/expressjs/express-resource

如何定义模型(model)?

Express自身并不感知数据库是否存在。数据库功能依赖于第三方 Node 模块提供的接口。

如何验证用户?

这是另一个 Express 不涉及的领域。你可以使用任何验证方式。对于简单的用户名/密码验证方式,可以参考这个实例。

Express 支持哪些模板引擎?

Express 支持任何符合 (path, locals, callback) 接口规范的模板引擎。 为了统一模板引擎的接口和缓存功能,请参考 consolidate.js 项目。其他未提及的模板引擎也可能支持 Express 接口规范。

如何处理 404 ?

在 Express 中,404 并不是一个错误(error)。因此,错误处理器中间件并不捕获 404。这是因为 404 只是意味着某些功能没有实现。也就是说,Express 执行了所有中间件、路由之后还是没有获取到任何输出。你所需要做的就是在其所有他中间件的后面添加一个处理 404 的中间件。如下:

app.use(function(req, res, next) {  res.status(404).send('Sorry cant find that!');});
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

请参考错误处理章节以了解更多信息。

错误处理章节:http://www.expressjs.com.cn/guide/error-handling.html

如何渲染纯 HTML 文件?

不需要!无需通过 res.render() 渲染 HTML。你可以通过 res.sendFile() 直接对外输出 HTML 文件。如果你需要对外提供的资源文件很多,可以使用 express.static() 中间件。


如何设置一个错误处理器?

错误处理器中间件的定义和其他中间件一样,唯一的区别是 4 个而不是 3 个参数,即 (err, req, res, next):

app.use(function(err, req, res, next) {  console.error(err.stack);  res.status(500).send('Something broke!');});
0 0