Node.js之express生成器express-generator
2017-01-16 17:49
591 查看
安装 Express 并将其保存到依赖列表中:
如果只是临时安装 Express,不想将它添加到依赖列表中,只需略去 –save 参数即可:
安装 Node 模块时,如果指定了 –save 参数,那么此模块将被添加到 package.json 文件中 dependencies 依赖列表中。 然后通过 npm install 命令即可自动安装依赖列表中所列出的所有模块。
继续之前请务必按照 安装 章节执行了所有的前期准备工作。
接下来,我们一起创建一个基本的 Express 应用。
注意:这里所创建是一个最最简单的 Express 应用,并且仅仅只有一个文件 — 和通过 Express 应用生成器 所创建的应用完全不一样,Express 应用生成器所创建的应用框架包含多个 JavaScript 文件、Jade
模板和针对不同用途的子目录。
进入 myapp 目录,创建一个名为 app.js 的文件,然后将下列代码复制进去:
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。
1
通过如下命令启动此应用:
然后在浏览器中打开 http://localhost:3000/ 并查看输出结果。
通过应用生成器工具 express 可以快速创建一个应用的骨架。
通过如下命令安装:
2
1
2
-h 选项可以列出所有可用的命令行选项:
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 的应用。
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
然后安装所有依赖包:
2
1
2
启动这个应用(MacOS 或 Linux 平台):
Windows 平台使用如下命令:
1
然后在浏览器中打开 http://localhost:3000/ 网址就可以看到这个应用了。i
通过 Express 应用生成器创建的应用一般都有如下目录结构:
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 路由做一个简单的介绍。路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET、POST 等)组成的,涉及到应用如何响应客户端对某个网站节点的访问。
每一个路由都可以有一个或者多个处理器函数,当匹配到路由时,这个/些函数将被执行。
路由的定义由如下结构组成:app.METHOD(PATH, HANDLER)。其中,app 是一个 express 实例;METHOD 是某个 HTTP 请求方式中的一个;PATH 是服务器端的路径;HANDLER 是当路由匹配到时需要执行的函数。
本教程假定已经存在一个命名为 app 的 express 实例了,并且应用程序是运行状态。如果你还不熟悉如何创建一个应用并使其运行,请参考 Hello world 实例。
下面的代码展示了几个路由实例:
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.static 可以方便地托管静态文件,例如图片、CSS、JavaScript 文件等。
将静态资源文件所在的目录作为参数传递给 express.static 中间件就可以提供静态资源文件的访问了。例如,假设在 public 目录放置了图片、CSS 和 JavaScript 文件,你就可以:
现在,public 目录下面的文件就可以访问了。
2
3
4
5
1
2
3
4
5
所有文件的路径都是相对于存放目录的,因此,存放静态文件的目录名不会出现在 URL 中。
如果你的静态资源存放在多个目录下面,你可以多次调用 express.static 中间件:
访问静态资源文件时,express.static 中间件会根据目录添加的顺序查找所需的文件。
如果你希望所有通过 express.static 访问的文件都存放在一个“虚拟(virtual)”目录(即目录根本不存在)下面,可以通过为静态资源目录指定一个挂载路径的方式来实现,如下所示:
挂载路径的方式参考:http://www.expressjs.com.cn/4x/api.html#app.use
现在,你就爱可以通过带有 “/static” 前缀的地址来访问 public 目录下面的文件了。
2
3
4
5
1
2
3
4
5
对于这个问题其实没有一个确定的答案。这要根据你的应用的规模和参与开发的团队来确定。为了尽可能灵活,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
Express自身并不感知数据库是否存在。数据库功能依赖于第三方 Node 模块提供的接口。
这是另一个 Express 不涉及的领域。你可以使用任何验证方式。对于简单的用户名/密码验证方式,可以参考这个实例。
Express 支持任何符合 (path, locals, callback) 接口规范的模板引擎。 为了统一模板引擎的接口和缓存功能,请参考 consolidate.js 项目。其他未提及的模板引擎也可能支持 Express 接口规范。
在 Express 中,404 并不是一个错误(error)。因此,错误处理器中间件并不捕获 404。这是因为 404 只是意味着某些功能没有实现。也就是说,Express 执行了所有中间件、路由之后还是没有获取到任何输出。你所需要做的就是在其所有他中间件的后面添加一个处理 404 的中间件。如下:
2
3
1
2
3
请参考错误处理章节以了解更多信息。
错误处理章节:http://www.expressjs.com.cn/guide/error-handling.html
不需要!无需通过 res.render() 渲染 HTML。你可以通过 res.sendFile() 直接对外输出 HTML 文件。如果你需要对外提供的资源文件很多,可以使用 express.static() 中间件。
错误处理器中间件的定义和其他中间件一样,唯一的区别是 4 个而不是 3 个参数,即 (err, req, res, next):
$ 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 -g1
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 directory1
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/www1
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 install1
2
1
2
启动这个应用(MacOS 或 Linux 平台):
$ DEBUG=myapp npm start
Windows 平台使用如下命令:
> set DEBUG=myapp & npm start1
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.jade 7 directories, 9 files1
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.jpg http://localhost:3000/css/style.css http://localhost:3000/js/app.js http://localhost:3000/images/bg.png http://localhost:3000/hello.html1
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.jpg http://localhost:3000/static/css/style.css http://localhost:3000/static/js/app.js http://localhost:3000/static/images/bg.png http://localhost:3000/static/hello.html1
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!'); });
相关文章推荐
- nodejs做小爬虫 nodejs 学习 day3
- node.js安装小结
- Nodejs基于mongoose模块的用法
- [Node.js]REPL(交互式解释器)
- 安装node多版本管理器nvm,以及nvm常用命令
- Node.js Design Patterns--2. Asynchronous Control Flow Patterns
- mac nodejs安装
- learnyounode学习笔记(一)
- nodejs - 如何完全更新
- Node.js学习笔记(二):模块
- nodejs原生,express,koa跨域问题解决
- Reverse Nodes in k-Group
- 第1.3章 node调用dubbo
- node.jsの安装helloWorld
- dotnet调用node.js写的socket服务(websocket/socket/socket.io)
- 在Node.js中使用RabbitMQ系列一 Hello world
- NodeJs上传文件至七牛
- nodejs例子
- NodeJs学习
- nodejs 实现钉钉ISV接入的加密解密方法