Express4.2.0安装和使用(一)

现在很多关于Node.js的书写关于Express的安装和使用都是比较旧的版本,现在新的版本安装和使用其实已经有一定的变化,刚好本人最近学习Node.js和Express,就顺道分享一下。本人主要讲在windows下的安装和使用,在linux下的其实大同小异,用linux的兄弟们肯定更熟软件的安装。

 

安装Node.js没什么大的变化,同样是官网下载.msi文件安装即可,安装Express执行命令:

 

npm install -g express
 
在以前的书上,装上这个就可以直接命令行使用Express了,但是现在的版本Express已经把命令行相关的部分分离了,需要再安装:
npm install -g express-generator
 
这之后就能用express命令了
 
在创建新的web应用是,如果不选择-e选项,则会使用jade模版,如果选择-e选项,则用ejs模版
express -e MyApp
 
则会在当前目录下创建一个名字为MyApp的文件夹,之后进入该文件夹并执行如下命令:
npm install
 
上面的命令根据package.json文件的内容自动安装该web应用的相关依赖文件,之后再执行如下命令便可启动服务器:
npm start
 
之后输入“127.0.0.1:3000”便可以看到如下结果
 
这样便表示已成功新建并运行一个web服务器应用
 

npm start

 

其实这个语句最终会执行以下语句

node ./bin/www

 

这个www文件是这样的:

 

可以看到默认是使用3000端口,可以在这里进行修改

 

 

Express4.2.0安装和使用(二)

express框架基本描述

通过express自带的创建方式创建项目后,项目文件夹内一般包含这几个内容

 

bin文件夹:该文件只包含了www这个文件,是用于web应用启动的

node_module文件夹:包含了该项目依赖的包和模块

public文件夹:存放静态文件,包括图片、css等

routes文件夹:存放该框架MVC中的C(控制)部分

views文件夹:存放该框架MVC中的V(视图)部分

app.js文件:对该应用进行配置

package.json:该web应用的基本信息,npm install根据该信息可以为应用安装所需的依赖

 

关于express的各种方法

express的各种方法主要用在app.js文件中,在该文件中进行一些路由设置、模版引擎设置、文件路径设置等。

 

set方法

set方法主要是设置一些参数,当前set主要用的是以下两句

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. app.set('views', path.join(__dirname, 'views'));  
  2. app.set('view engine', 'ejs');  
  1. 第一句表示设置前台模版的路径为工程文件夹下的views文件夹下
  2. 第二句表示使用的前台模版引擎为ejs
  3. use方法
  4. use方法表示设置当用户访问时将调用设定的中间件,基本用法如下:
  5. app.use(function(req, res, next){  
  6.     //dosometing;  
  7.     next();  
  8. });  


所谓的中间件,可以理解为从底层往上层传输前,进行一定处理的函数或过程。

 

当有用户访问web应用时,便会调用use方法设置好的中间件函数,在该函数处理完之后,调用了next()方法,该方法调用下一个设置好的中间件函数

 

在上面的use用法中,所有用户请求都会调用设置的中间件函数。为了只让某些用户请求调用特定的中间件函数,use还提供了如下用法:

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. app.use("/", function(req, res, next){  
  2.     //dosomething;  
  3.     next();  
  4. });  


该语句中只对根目录的请求调用该中间件函数

 

 

get方法

get方法也是设置中间件函数,它的特点在于只响应用户的get方法请求,并且没有像use那样具备next()方法。

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. app.get("/", function(req, res){  
  2.     //dosomething;  
  3. });  

上面的代码会响应用户对根目录的get请求

 

post方法

post方法与get方法类似,特点是只响应用户的post方法请求,其余与get类似,不做介绍

 

all方法

用户对all方法指定路径的所有访问,都会得到all方法的响应,可以吧all方法看作是get和post方法的结合。

 

纵观app.js

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. //app.js  
  2. var express = require('express');  
  3. var path = require('path');  
  4. var favicon = require('static-favicon');  
  5. var logger = require('morgan');  
  6. var cookieParser = require('cookie-parser');  
  7. var bodyParser = require('body-parser');  
  8.   
  9. var routes = require('./routes/index');  
  10. var users = require('./routes/users');  
  11.   
  12. var app = express();  
  13.   
  14. // view engine setup  
  15. app.set('views', path.join(__dirname, 'views'));  
  16. app.set('view engine', 'ejs');  
  17.   
  18. app.use(favicon());  
  19. app.use(logger('dev'));  
  20. app.use(bodyParser.json());  
  21. app.use(bodyParser.urlencoded());  
  22. app.use(cookieParser());  
  23. app.use(express.static(path.join(__dirname, 'public')));  
  24.   
  25. app.use('/', routes);  
  26. app.use('/users', users);  
  27.   
  28. /// catch 404 and forward to error handler  
  29. app.use(function(req, res, next) {  
  30.     var err = new Error('Not Found');  
  31.     err.status = 404;  
  32.     next(err);  
  33. });  
  34.   
  35. /// error handlers  
  36.   
  37. // development error handler  
  38. // will print stacktrace  
  39. if (app.get('env') === 'development') {  
  40.     app.use(function(err, req, res, next) {  
  41.         res.status(err.status || 500);  
  42.         res.render('error', {  
  43.             message: err.message,  
  44.             error: err  
  45.         });  
  46.     });  
  47. }  
  48.   
  49. // production error handler  
  50. // no stacktraces leaked to user  
  51. app.use(function(err, req, res, next) {  
  52.     res.status(err.status || 500);  
  53.     res.render('error', {  
  54.         message: err.message,  
  55.         error: {}  
  56.     });  
  57. });  
  58.   
  59.   
  60. module.exports = app;  


以上就是express快速新建一个项目时生成的app.js文件,下面对其中的部分语句进行解析

 

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. app.use(favicon());  

 

favicon()属于connect框架(Node.js一个中间件框架)的内建中间件,使用默认favicon图标,如果想让项目改用自己的图标,则改为:

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. app.use(favicon(__dirname + "/public/images/myIcon.ico")));  
[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. 之后访问localhost:3000/favicon.ico刷新缓存。根据笔者调试和阅读源码,除非访问/favicon.ico,否则无法刷新图标,因此建议考虑在html页面中获取图标资源  
[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. </pre><pre name="code" class="plain">  

 

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. app.use(logger('dev'));  

该语句定义项目以开发模式启动,在该模式下,当用户进行访问时,会有如下输出

 

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. app.use(bodyParser.json());  
  2. app.use(bodyParser.urlencoded());  

以上语句用于解析请求体

 

 

转自:http://blog.csdn.net/sadoshi/article/details/28308099