express搭建服务端框架

用“MEAN”技术栈开发web应用(二)express搭建服务端框架

2015/11/14 · 基本功技术 ·
MEAN

初稿出处:
吕大豹   

上一篇我们讲了怎么着利用angular搭建起项目标前端框架,前端抽象出一个service层来向后端发送请求,后端则赶回相应的json数据。本篇大家来介绍一下,怎么着在nodejs环境下使用express来搭建起服务端,使之不易的响应前端的央浼。本文所讲的言传身教仍旧依据我们的上学项目QuestionMaker()

个人技术学习笔记,如有雷同,纯属正常,请勿喷,谢谢合作。

express 项目 最好永不全局安装 直接在当前目录下 npm install express
–save
生成器 cnpm install express-generator -g
然后express -h 查看是或不是成功
利用express myapp 创制 cnpm install 安装看重项 set DEBUG=myaoo & npm
start 启动

路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP
方法(GET、POST
等)组成的,涉及到利用怎么样响应客户端对某个网站节点的拜访。
每一个路由都能够有一个或者五个计算机函数,当匹配到路由时,这几个/些函数将被实践。
路由的概念由如下结构组成:
app.METHOD(PATH, HANDLER)

  • app 是一个 express 实例
  • METHOD 是某个HTTP 请求格局中的一个
  • PATH 是劳务器端的路线
  • HANDLER 是当路由杰出到时索要实践的函数
    // 对网站首页的拜会归来 “Hello World!” 字样
    app.get(‘/’, function (req, res) {
    res.send(‘Hello World!’);
    });

// 网站首页接受 POST 请求
app.post(‘/’, function (req, res) {
res.send(‘Got a POST request’);
});

Express 内置的 express.static
可以一本万利地托管静态文件,例如图片、CSS、JavaScript 文件等。
将静态资源文件所在的目录作为参数传递给 express.static
中间件就可以提供静态资源文件的拜会了。例如,若是在 public
目录放置了图片、CSS 和 JavaScript
文件,你就可以:app.use(express.static(‘public’));
万一你的静态资源存放在七个目录下边,你可以频仍调用 express.static
中间件:
app.use(express.static(‘public’));
app.use(express.static(‘files’));

app.all() 是一个奇异的路由方法,没有此外 HTTP
方法与其相应,它的成效是对此一个门道上的有着请求加载中间件。
app.all(‘/secret’, function (req, res, next) {
console.log(‘Accessing the secret section …’);
next(); // pass control to the next handler
});

路由路径和请求方法一起定义了请求的端点,它可以是字符串、字符串方式或者正则表明式。
字符串:
// 匹配 /about 路径的伏乞
app.get(‘/about’, function (req, res) {
res.send(‘about’);
});

// 匹配 /random.text 路径的伸手
app.get(‘/random.text’, function (req, res) {
res.send(‘random.text’);
});
字符串格局:
// 匹配 abcd、abxcd、abRABDOMcd、ab123cd等
app.get(‘/abcd’, function(req, res) {
res.send(‘ab
cd’);
});
// 匹配 /abe 和 /abcde
app.get(‘/ab(cd)?e’, function(req, res) {
res.send(‘ab(cd)?e’);
});
正则:
// 匹配 butterfly、dragonfly,不匹配 butterflyman、dragonfly man等
app.get(/.fly$/, function(req, res) {
res.send(‘/.
fly$/’);
});

亚洲必赢官网 ,express

Express 简介

Express 是一个简单而灵活的 node.js Web应用框架,
提供了一多元有力特性扶助你创制各类 Web 应用,和增进的 HTTP 工具。

选取 Express 可以很快地搭建一个全体意义的网站。

Express 框架主旨特性:

  • 可以设置中间件来响应 HTTP 请求。

  • 概念了路由表用于实施差别的 HTTP 请求动作。

  • 可以通过向模板传递参数来动态渲染 HTML 页面。


运转起基于express的web服务器

express是一个web应用开发框架,它依据nodejs,增加了许多web开发所需的效率,使得大家可以很便宜的拜会和操作request和response。请小心它和nginx或者tomcat并不是一个概念,它是一个支付框架,而不是服务器。

运行起基于express的web服务器是分外简单的,因为express都绑你封装好了。首先须要用npm安装好express,然后在品种根目录下新建一个server.js文件,内容如下:

JavaScript

var express = require(‘express’); var app = express(); app.listen(3000);
var _rootDir = __dirname; var protectDir = _rootDir + ‘/protect/’;
app.use(express.static(_rootDir)); //注册路由 app.get(‘/’,
function(req, res){ res.sendFile(_rootDir+’/src/index.html’); });
app.use(function(req, res, next) {
res.status(404).sendFile(_rootDir+’/src/404.html’); });
app.use(function(err, req, res, next) { console.error(err.stack);
res.status(500).send(‘500 Error’); });

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var express = require(‘express’);
var app = express();
app.listen(3000);
 
var _rootDir = __dirname;
var protectDir = _rootDir + ‘/protect/’;
 
app.use(express.static(_rootDir));
 
//注册路由
app.get(‘/’, function(req, res){
    res.sendFile(_rootDir+’/src/index.html’);
});
 
app.use(function(req, res, next) {
     res.status(404).sendFile(_rootDir+’/src/404.html’);
});
app.use(function(err, req, res, next) {
     console.error(err.stack);
     res.status(500).send(‘500 Error’);
});

上述代码已毕了那多少个职能,首先创设了http服务器,监听在3000端口。

然后app.use(express.static(_rootDir));这一行是利用了静态文件服务的中间件,那样我们项目下的js、css以及图片等静态文件就都足以访问到了。

接下去是登记路由,此处只至极一个路由规则,那就是”/”(网站的根目录),当匹配到此路由后把首页文件index.html直接用res.sendFile方法给发送到浏览器端。那样浏览器用

然则在本项目中,大家用的是angular的前端模板,所将来端就不要求模板了,没有开展配备。大家的路由机制也是一心选用的ng的前端路由,所以在express中只布置一条就够了。

在最后还有两块代码,分别是404和500不当的破获。你也许会可疑为啥是那样写吗?从上到下排下来就能分别捕获404和500了吧?其实那就是express的中间件机制,在此机制下,对客户端请求的拍卖像是一个流水线,把具备中间件串联起来,只要某个中间件把请求重回了,就长逝执行,否则就从上到下一向处理此恳请。

地点代码的流水线就是,先按路由规则来合作路径,假若路由万分不到,则以为是暴发404。500的错误请留心一个细节,在回调函数的参数中,第三个会传播err,就是谬误对象,以此来标记是一个500不当。

路由句柄

可以为呼吁处理提供五个回调函数,其行事看似中间件。唯一的不同是那么些回调函数有可能调用
next(‘route’)
方法而略过任何路由回调函数。可以选取该机制为路由定义前提条件,若是在存活路径上继续执行没有意思,则可将控制权交给剩下的门径。
路由句柄有各个方式,可以是一个函数、一个函数数组,或者是双方交织,如下:
var cb0 = function (req, res, next) {
console.log(‘CB0’);
next();
}

var cb1 = function (req, res, next) {
console.log(‘CB1’);
next();
}

app.get(‘/example/d’, [cb0, cb1], function (req, res, next) {
console.log(‘response will be sent by the next function …’);
next();
}, function (req, res) {
res.send(‘Hello from D!’);
});

简介

安装 Express

设置 Express 并将其保存到依靠列表中:

$ cnpm install express --save

上述命令会将 Express 框架安装在当前目录的 node_modules 目录中,
node_modules 目录下会自动创立 express
目录。以下多少个首要的模块是索要与 express 框架一起安装的:

  • body-parser – node.js 中间件,用于拍卖 JSON, Raw, Text 和 URL
    编码的多寡。

  • cookie-parser
    那就是一个解析库克ie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。

  • multer – node.js 中间件,用于拍卖
    enctype=”multipart/form-data”(设置表单的MIME编码)的表单数据。

$ cnpm install body-parser --save
$ cnpm install cookie-parser --save
$ cnpm install multer --save

略知一二中间件

express的主导是中间件机制,通过采纳各样中间件,可以已毕灵活的组装大家所需的作用。中间件是在管道中履行的,所谓管道就是像流水线一样,每抵达一个加工区,相应的中间件就可以处理request和response对象,处理完后再送往下一个加工区。若是某个加工区把请求终结了,比如调用send方法重返给了客户端,那么处理就止住了。半数以上景观下,都有现成的中间件供大家运用,比如用body-parser解析请求实体,用路由(路由也是一种中间件)来不易的派发请求。

譬如说我们在server.js中添加如下的代码:

JavaScript

app.use(function(req, res, next){ console.log(‘中间件1’); next(); });
app.use(function(req, res, next){ console.log(‘中间件2’); });

1
2
3
4
5
6
7
8
app.use(function(req, res, next){
     console.log(‘中间件1’);
     next();
});
 
app.use(function(req, res, next){
     console.log(‘中间件2’);
});

我们添加了多少个中间件,请求过来往后会先被第二个捕获,然后开展拍卖,输出“中间件1”。后边随着执行了next()方法,就会进去下一个中间件。一个中间件执行后只有三种选取,要么用next指向下一个中间件,要么将请求重返。如果什么都不做,请求将会被挂起,也就是说浏览器端将得不到再次回到,一贯处在pendding状态。例如地方的中等件2,将会招致请求挂起,那是应有杜绝的。

一呼百应措施

[res.end()] | 终结响应处理流程。 |
[res.redirect()] | 重定向请求。 |
[res.render()] | 渲染视图模板。 |
[res.send()] | 发送种种别型的响应。 |
[res.sendFile] | 以八位字节流的格局发送文书。 |
可使用 app.route()
创建路由路径的链式路由句柄。由于路线在一个地点指定,那样做无中生有创立模块化的路由,而且裁减了代码冗余和拼写错误。
app.route(‘/book’)
.get(function(req, res) {
res.send(‘Get a random book’);
})
.post(function(req, res) {
res.send(‘Add a book’);
})
.put(function(req, res) {
res.send(‘Update the book’);
});
可采取 express.Router
类创设模块化、可挂载的路由句柄。上面的实例程序创制了一个路由模块,并加载了一个中间件,定义了有些路由,并且将它们挂载至采纳的路子上。
var express = require(‘express’);
var router = express.Router();
// 该路由使用的中间件
router.use(function timeLog(req, res, next) {
console.log(‘Time: ‘, Date.now());
next();
});
// 定义网站主页的路由
router.get(‘/’, function(req, res) {
res.send(‘Birds home page’);
});
// 定义 about 页面的路由
router.get(‘/about’, function(req, res) {
res.send(‘About birds’);
});
module.exports = router;
接下来在动用中加载路由模块:var birds = require(‘./birds’); …
app.use(‘/birds’, birds);

  • Express 是一个精简而灵活的 node.js
    Web应用框架,
    提供了一多重有力特性协理您成立各个 Web
    应用,和添加的 HTTP
    工具。
  • 动用 Express
    可以连忙地搭建一个一体化意义的网站

首先个 Express 框架实例

接下去大家选择 Express 框架来输出 “Hello World”。

以下实例中大家引入了 express 模块,并在客户端发起呼吁后,响应 “Hello
World” 字符串。

创建 express_demo.js 文件,代码如下所示:

express搭建服务端框架。路由设计

运作起了服务器,精通了中间件编程方式,接下去大家就该为前端提供api了。比如前端post一个伸手到/api/submitQuestion来交给一份数据,我们该怎么接受请求并做出处理吧,那就是路由的规划了。

给app.use的率先个参数传入路径可以包容到对应的呼吁,例如:

JavaScript

app.use(‘/api/submitQuestion’, function(){})

1
app.use(‘/api/submitQuestion’, function(){})

如此就可以捕获到刚刚的交给试题的乞求,在其次个参数中可以举行相应的拍卖,比如把数据插入到数据库。

不过,要专注了,express路由的不易使用姿势并不是那般的。app.use是用来合营中间件的门道的,而不是呼吁的路线。因为路由也是一种中间件,所以那样的用法也是可以一挥而就成效的,但是大家依然应当根据法定正规的写法来写。

正式的写法是哪些体统吧?代码如下:

JavaScript

var apiRouter = express.Router(); apiRouter.post(‘/submitQuestion’,
questionController.save); app.use(‘/api’, apiRouter);

1
2
3
var apiRouter = express.Router();
apiRouter.post(‘/submitQuestion’, questionController.save);
app.use(‘/api’, apiRouter);

俺们采用的是express.Router那些目标,它一律有use、post、get等艺术,用来合营请求路径。然后大家再利用app.use把apiRouter作为首个参数传进去。

要注意的是apiRouter.post和app.use的率先个参数。app.use匹配的是伸手的“根路径”,那样可以把请求分为差其他类型,比如具有的异步接口大家都叫api,那么那类请求大家就都应有挂在“/api”下。按照那样的规则,我们一切项目标路由规则如下:

JavaScript

//注册路由 app.get(‘/’, function(req, res){
res.sendFile(_rootDir+’/src/index.html’); }); var apiRouter =
express.Router(); apiRouter.post(‘/getQuestion’,
questionController.getQuestion); apiRouter.post(‘/getQuestions’,
questionController.getQuestions); apiRouter.post(‘/submitQuestion’,
questionController.save); apiRouter.post(‘/updateQuestion’,
questionController.update); apiRouter.post(‘/removeQuestion’,
questionController.remove); apiRouter.post(‘/getPapers’,
paperController.getPapers); apiRouter.post(‘/getPaper’,
paperController.getPaper); apiRouter.post(‘/getPaperQuestions’,
paperController.getPaperQuestions); apiRouter.post(‘/submitPaper’,
paperController.save); apiRouter.post(‘/updatePaper’,
paperController.update); apiRouter.post(‘/removePaper’,
paperController.remove); app.use(‘/api’, apiRouter);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//注册路由
app.get(‘/’, function(req, res){
    res.sendFile(_rootDir+’/src/index.html’);
});
 
var apiRouter = express.Router();
apiRouter.post(‘/getQuestion’, questionController.getQuestion);
apiRouter.post(‘/getQuestions’, questionController.getQuestions);
apiRouter.post(‘/submitQuestion’, questionController.save);
apiRouter.post(‘/updateQuestion’, questionController.update);
apiRouter.post(‘/removeQuestion’, questionController.remove);
apiRouter.post(‘/getPapers’, paperController.getPapers);
apiRouter.post(‘/getPaper’, paperController.getPaper);
apiRouter.post(‘/getPaperQuestions’, paperController.getPaperQuestions);
apiRouter.post(‘/submitPaper’, paperController.save);
apiRouter.post(‘/updatePaper’, paperController.update);
apiRouter.post(‘/removePaper’, paperController.remove);
 
app.use(‘/api’, apiRouter);

在router的第三个参数中,我们传入了questionController.save那样的情势,那是什么样东西啊?怎么有点MVC的含意呢?没错,大家已经可以合营到路由了,那服务端的工作逻辑以及数据库访问等该怎么社团代码呢?

中间件

Express是由路由和中间件构成一个的 web 开发框架:从实质上来说,一个
Express 应用就是在调用种种中间件。
中间件Middleware是一个函数,它可以访问请求对象(request
object), 响应对象(response
object), 和 web
应用中居于请求-响应循环流程中的中间件,一般被命名为 next 的变量。
中间件的效果包含:
-执行其余代码。
-修改请求和响应对象。
-终结请求-响应循环。
-调用堆栈中的下一个中间件。
假若当前中间件没有截至请求-响应循环,则必须调用 next()
方法将控制权交给下一个中间件,否则请求就会挂起。

安装并运行

express_demo.js 文件代码:

//express_demo.js
文件 var express = require(‘express’);
var app = express(); app.get(‘/’, function (req, res) { res.send(‘Hello World’);
}) var
server = app.listen(8081, function ()
{ var host = server.address().address var port = server.address().port console.log(“应用实例,访问地址为
“, host, port) })

推行以上代码:

$ node express_demo.js 
应用实例,访问地址为 http://0.0.0.0:8081

在浏览器中走访

亚洲必赢官网 1


用“MVC”社团代码

用MVC的布局协会代码当然是黄金法则了。express可以用模板引擎来渲染view层,路由体制来公司controller层,可是express并没有明确规定MVC结构应该怎么着写,而是把自由拔取交给你,自己来协会MVC结构。当然你也足以团体其余方式,比如像Java中的“n层架构”。

在本项目中,大家就以文件夹的样式来简单协会一下。因为我们运用了前者模板,所将来端的view层就不设有了,唯有controller和model。看一下品类的目录:

亚洲必赢官网 2

在protect下有三个文本夹controllers和models分别放C和M。我们路由中拔取的questionController对象就定义在questionController.js中,来看一下用于保存试题的save方法是怎么定义的:

JavaScript

var Question = require(‘../models/question’); module.exports = {
//添加试题 save: function(req, res){ var data = req.body.question;
Question.save(data, function(err, data){ if(err){ res.send({success:
false, error: err}); } else{ res.send({success: true, data: data}); }
}); } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var Question = require(‘../models/question’);
module.exports = {
     //添加试题
     save: function(req, res){
          var data = req.body.question;
          Question.save(data, function(err, data){
               if(err){
          res.send({success: false, error: err});
     }
     else{
          res.send({success: true, data: data});
     }
          });
     }
}

questionController作为一个模块,使用规范的commonjs语法,大家定义了save方法,通过req.body.question,可以获得前台传过来的数量。在那个模块中,大家require了位于model层的Question模型,没错,它就是用来操作数据库的,调用Question.save方法,那份数据就存入了数据库,然后在回调函数中,大家用res.send将json数据重返给前端。

概念好questionController后,大家就足以在server.js中把它给require进去了,然后就有了前头大家在路由中选用的

JavaScript

apiRouter.post(‘/submitQuestion’, questionController.save);

1
apiRouter.post(‘/submitQuestion’, questionController.save);

整整工艺流程就勾搭起来了。

models文件夹中放的就是模型了,用来治本与数据库的映射和交互,那里运用了mongoose作为数据库的操作工具,model层怎么着来编排,本篇就不做牵线了,在下一篇中大家再详尽讲解。

终极再声Bellamy下,本篇小说的代码是按照一个练兵项目QuestionMaker,为了更好精通作品中的叙述,请查看项指标源码:

1 赞 2 收藏
评论

亚洲必赢官网 3

应用级中间件

应用级中间件绑定到app对象使用 app.use() 和 app.METHOD()
var app = express();
// 没有挂载路径的中间件,应用的每个请求都会履行该中间件
app.use(function (req, res, next) {
console.log(‘Time:’, Date.now());
next();
});
// 挂载至 /user/:id 的中间件,任何针对 /user/:id 的请求都会执行它
app.use(‘/user/:id’, function (req, res, next) {
console.log(‘Request Type:’, req.method);
next();
});
// 路由和句柄函数(中间件系统),处理指向 /user/:id 的 GET 请求
app.get(‘/user/:id’, function (req, res, next) {
res.send(‘USER’);
});

万一急需在中间件栈中跳过剩余中间件,调用 next(‘route’)
方法将控制权交给下一个路由
// 一个中级件栈,处理指向 /user/:id 的 GET 请求
app.get(‘/user/:id’, function (req, res, next) {
// 即使 user id 为 0, 跳到下一个路由
if (req.params.id == 0) next(‘route’);
// 否则将控制权交给栈中下一个中间件
else next(); //
}, function (req, res, next) {
// 渲染常规页面
res.render(‘regular’);
});
// 处理 /user/:id, 渲染一个非同平时页面
app.get(‘/user/:id’, function (req, res, next) {
res.render(‘special’);
});

  • sudo npm install express
  • var express = require(“express”);
    var app = express();//初始化

恳请和响应

Express 应用使用回调函数的参数: requestresponse
对象来处理请求和响应的数据。

app.get('/', function (req, res) {
   // --
})

requestresponse 对象的现实介绍:

Request 对象 – request 对象表示 HTTP
请求,包涵了请求查询字符串,参数,内容,HTTP 底部等质量。常见属性有:

  1. req.app:当callback为外部文件时,用req.app访问express的实例
  2. req.baseUrl:获取路由目前设置的URL路径
  3. req.body / req.cookies:得到「请求主体」/ Cookies
  4. req.fresh / req.stale:判断请求是不是还「新鲜」
  5. req.hostname / req.ip:获取主机名和IP地址
  6. req.originalUrl:获取原始请求URL
  7. req.params:获取路由的parameters
  8. req.path:获取请求路径
  9. req.protocol:获取协议项目
  10. req.query:获取URL的查询参数串
  11. req.route:获取当前同盟的路由
  12. req.subdomains:获取子域名
  13. req.accepts():检查可承受的伏乞的文档类型
  14. req.acceptsCharsets / req.acceptsEncodings /
    req.acceptsLanguages:再次回到指定字符集的率先个可接受字符编码
  15. req.get():获取指定的HTTP请求头
  16. req.is():判断请求头Content-Type的MIME类型

Response 对象 – response 对象表示 HTTP
响应,即在吸纳到请求时向客户端发送的 HTTP 响应数据。常见属性有:

  1. res.app:同req.app一样
  2. res.append():追加指定HTTP头
  3. res.set()在res.append()后将重置此前安装的头
  4. res.cookie(name,value [,option]):设置Cookie
  5. opition: domain / expires / httpOnly / maxAge / path / secure /
    signed
  6. res.clearCookie():清除Cookie
  7. res.download():传送指定路线的文书
  8. res.get():再次来到指定的HTTP头
  9. res.json():传送JSON响应
  10. res.jsonp():传送JSONP响应
  11. res.location():只设置响应的Location HTTP头,不设置状态码或者close
    response
  12. res.redirect():设置响应的Location HTTP头,并且安装状态码302
  13. res.send():传送HTTP响应
  14. res.sendFile(path [,options] [,fn]):传送指定路线的公文
    -会自动根据文件extension设定Content-Type
  15. res.set():设置HTTP头,传入object能够一遍设置三个头
  16. res.status():设置HTTP状态码
  17. res.type():设置Content-Type的MIME类型

路由级中间件

路由级中间件和应用级中间件一样,只是它绑定的靶子为 express.Router()。
var router = express.Router();路由级使用 router.use() 或 router.VERB()
加载。
var app = express();
var router = express.Router();
// 没有挂载路径的中间件,通过该路由的种种请求都会履行该中间件
router.use(function (req, res, next) {
console.log(‘Time:’, Date.now());
next();
});
// 一个当中件栈,呈现任何针对 /user/:id 的 HTTP 请求的新闻
router.use(‘/user/:id’, function(req, res, next) {
console.log(‘Request URL:’, req.originalUrl);
next();
}, function (req, res, next) {
console.log(‘Request Type:’, req.method);
next();
});
// 一个中级件栈,处理指向 /user/:id 的 GET 请求
router.get(‘/user/:id’, function (req, res, next) {
// 如若 user id 为 0, 跳到下一个路由
if (req.params.id == 0) next(‘route’);
// 负责将控制权交给栈中下一个中间件
else next(); //
}, function (req, res, next) {
// 渲染常规页面
res.render(‘regular’);
});
// 处理 /user/:id, 渲染一个非正规页面
router.get(‘/user/:id’, function (req, res, next) {
console.log(req.params.id);
res.render(‘special’);
});
// 将路由挂载至接纳
app.use(‘/’, router);

主干功用

路由

大家曾经通晓了 HTTP
请求的基本使用,而路由控制了由哪个人(指定脚本)去响应客户端请求。

在HTTP请求中,大家得以因此路由提取出请求的URL以及GET/POST参数。

接下去大家增加 Hello World,添加一些功效来处理更加多门类的 HTTP 请求。

创建 express_demo2.js 文件,代码如下所示:

错误处理中间件

错误处理中间件有 4 个参数,定义错误处理中间件时务必采取那 4 个参数。
app.use(function(err, req, res, next) {
console.error(err.stack);
res.status(500).send(‘Something broke!’);
});

路由

express_demo2.js 文书代码:

var express = require(‘express’);
var app = express(); // 主页输出 “Hello
World” app.get(‘/’, function (req, res) { console.log(“主页 GET 请求”);
res.send(‘Hello GET’);
}) //
POST 请求 app.post(‘/’, function (req, res) { console.log(“主页 POST 请求”);
res.send(‘Hello POST’);
}) //
/del_user 页面响应 app.get(‘/del_user’, function (req, res) { console.log(“/del_user 响应 DELETE
请求”); res.send(‘删除页面’); })
// /list_user 页面
GET 请求 app.get(‘/list_user’, function (req, res) { console.log(“/list_user GET 请求”);
res.send(‘用户列表页面’);
}) //
对页面 abcd, abxcd, ab123cd, 等响应 GET 请求 app.get(‘/ab*cd’,
function(req, res) { console.log(“/ab*cd GET 请求”);
res.send(‘正则匹配’); }) var server = app.listen(8081, function () { var
host = server.address().address var port = server.address().port
console.log(“应用实例,访问地址为 “, host, port)
})

执行以上代码:

$ node express_demo2.js 
应用实例,访问地址为 http://0.0.0.0:8081

接下去你可以尝尝访问 分歧的地点,查看效果。

在浏览器中做客

亚洲必赢官网 4

在浏览器中走访

亚洲必赢官网 5

在浏览器中做客

亚洲必赢官网 6


模板引擎

views, 放模板文件的目录,比如: app.set(‘views’, ‘./views’)
view engine, 模板引擎,比如: app.set(‘view engine’, ‘jade’)
假设 view engine
设置成功,就不要求显式指定引擎,或者在行使中加载模板引擎模块,Express
已经在里头加载,即不
app.set(‘view engine’, ‘jade’);
即不用指明视图文件的后缀
app.get(‘/’, function (req, res) {
res.render(‘index’, { title: ‘Hey’, message: ‘Hello there!’});
});

get方法 —
根据请求路径来处理客户端发出的GET请求

静态文件

Express 提供了放置的高中级件 express.static 来设置静态文件如:图片,
CSS, JavaScript 等。

你可以接纳 express.static
中间件来安装静态文件路径。例如,如若您将图纸, CSS, JavaScript 文件放在
public 目录下,你可以如此写:

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

俺们得以到 public/images 目录下放些图片,如下所示:

node_modules
server.js
public/
public/images
publiclogo.png

让我们再修改下 “Hello World” 应用添加处理静态文件的功力。

创建 express_demo3.js 文件,代码如下所示:

app.get(path,cb);
*   path:为呼吁的门路
*   cb  :第四个参数为处理函数的回调,有七个参数request和response,代表呼吁信息和响应新闻

express_demo3.js 文件代码:

var express = require(‘express’);
var app = express(); app.use(express.static(‘public’)); app.get(‘/’, function (req, res) { res.send(‘Hello World’);
}) var
server = app.listen(8081, function ()
{ var host = server.address().address var port = server.address().port console.log(“应用实例,访问地址为
“, host, port) })

实施以上代码:

$ node express_demo3.js 
应用实例,访问地址为 http://0.0.0.0:8081

举办以上代码:

在浏览器中做客

亚洲必赢官网 7


前者页面代码

GET 方法

以下实例演示了在表单中通过 GET 方法提交五个参数,大家得以选拔 server.js
文件内的 process_get 路由器来处理输入:

  • <!DOCTYPE html>
    <html lang=“en”>
    <head>
        <meta charset=“UTF-8”>
        <title>Title</title>
    </head>
    <body>
    <form action=“/list” method=“post”>
        用户名:<input type=“text” name=“user”><br>
        密码: <input type=“password”><br>
        <input type=“submit” value=“**发送**”>
    </form>
    </body>
    </html>

index.htm 文件代码:

<html> <body> <form action=”” method=”GET”>
First Name: <input type=”text”
name=”first_name”>
<br> Last Name: <input type=”text” name=”last_name”> <input type=”submit” value=”Submit”>
</form> </body> </html>

 

服务端

server.js 文件代码:

var express = require(‘express’);
var app = express(); app.use(express.static(‘public’)); app.get(‘/index.htm’, function (req, res) { res.sendFile( __dirname + “/” +
“index.htm” ); })
app.get(‘/process_get’, function (req, res) { // 输出 JSON 格式 response = { first_name:req.query.first_name, last_name:req.query.last_name }; console.log(response); res.end(JSON.stringify(response));
}) var
server = app.listen(8081, function ()
{ var host = server.address().address var port = server.address().port console.log(“应用实例,访问地址为
“, host, port) })

实施以上代码:

node server.js 
应用实例,访问地址为 http://0.0.0.0:8081

浏览器访问

亚洲必赢官网 8

现行你能够向表单输入数据,并交由,如下演示:

亚洲必赢官网 9


  • //处理get形式发送的请求
    app.get(“/“, function (req,res) {
        //重返一个静态文件
        res.sendFile(__dirname+”/post.html”);
    });
    app.get(“/list”, function (req,res) {
        //重返一个字符串
        res.send(“get”+req.url);
    });
    app.post(“/list”, function (req,res) {

        res.send(“post”+req.url);
    });
    //all就是拍卖不论是其余措施发送的请求,*为随意路径
    app.all(“*”, function (req,res) {
        res.send(“Welcome to
    Express”);
    });
    //设置端口号
    app.listen(8080);

POST 方法

以下实例演示了在表单中经过 POST 方法提交七个参数,大家可以利用 server.js
文件内的 process_post 路由器来处理输入:

收获请求的参数

index.htm 文件代码:

<html> <body> <form action=”” method=”POST”>
First Name: <input type=”text”
name=”first_name”>
<br> Last Name: <input type=”text” name=”last_name”> <input type=”submit” value=”Submit”>
</form> </body> </html>

 

  • 获得请求参数
    *  req.host:重返请求头里取的主机名(不含端口号)
    *  req.path:重临请求的url的路径名
    *  req.query:是一个可取得客户端get请求路径参数的目的属性,包括着被解析过的哀告参数对象,默许为{}
    *  req.params:获取路由的parameters

server.js 文件代码:

var express = require(‘express’);
var app = express(); var bodyParser = require(‘body-parser’);
// 创立application/x-www-form-urlencoded 编码解析 var
urlencodedParser =
bodyParser.urlencoded({ extended: false })
app.use(express.static(‘public’)); app.get(‘/index.htm’, function (req, res) { res.sendFile( __dirname + “/” +
“index.htm” ); })
app.post(‘/process_post’, urlencodedParser, function (req, res) { // 输出 JSON 格式 response = { first_name:req.body.first_name, last_name:req.body.last_name }; console.log(response); res.end(JSON.stringify(response));
}) var
server = app.listen(8081, function ()
{ var host = server.address().address var port = server.address().port
console.log(“应用实例,访问地址为 “, host, port)
})

执行以上代码:

$ node server.js
应用实例,访问地址为 http://0.0.0.0:8081

浏览器访问

亚洲必赢官网 10

现行你可以向表单输入数据,并交由,如下演示:

亚洲必赢官网 11


得到再次来到的参数

文件上传

以下大家创设一个用以上传文件的表单,使用 POST 方法,表单 enctype
属性设置为 multipart/form-data。

  • 4.重返参数
    *   res.send();重回数据,默许会转为字符串,编码为utf8
    *   res.sendFile();重临文件
    *   res.sendStatus();再次回到状态码

index.htm 文件代码:

<html> <head> <title>文件上传表单</title> </head> <body> <h3>文件上传:</h3> 接纳一个文书上传: <br />
<form action=”/file_upload” method=”post” enctype=”multipart/form-data”>
<input type=”file” name=”image”
size=”50″ /> <br />
<input type=”submit” value=”上传文件” /> </form> </body> </html>

 

例子

server.js 文件代码:

<pre> var
express = require(‘express’);
var app = express(); var fs = require(“fs”);
var bodyParser = require(‘body-parser’);
var multer = require(‘multer’);
app.use(express.static(‘public’)); app.use(bodyParser.urlencoded({ extended: false })); app.use(multer({ dest: ‘/tmp/’}).array(‘image’)); app.get(‘/index.htm’, function (req, res) { res.sendFile( __dirname + “/” +
“index.htm” ); })
app.post(‘/file_upload’, function (req, res) { console.log(req.files[0]); // 上传的文书音讯 var des_file = __dirname + “/” + req.files[0].originalname;
fs.readFile( req.files[0].path, function (err, data) {
fs.writeFile(des_file, data, function (err) { if( err ){ console.log(
err ); }else{ response = { message:’File uploaded successfully’,
filename:req.files[0].originalname }; } console.log( response );
res.end( JSON.stringify( response ) ); }); }); }) var server =
app.listen(8081, function () { var host = server.address().address var
port = server.address().port console.log(“应用实例,访问地址为
“, host, port)
})

执行以上代码:

$ node server.js 
应用实例,访问地址为 http://0.0.0.0:8081

浏览器访问

亚洲必赢官网 12

现今你可以向表单输入数据,并交付,如下演示:

亚洲必赢官网 13


  • //
    app.get(“/query”, function (req,res) {

        res.send(req.query);
    });
    //
    app.get(“/article/:id/:name”,
    function (req,res) {
        res.send(req.params);
    });

    app.all(‘/*’, function(req,res){
        console.log(req.path);
        console.log(req.host);
        res.send(“没找到页面”);
    });

    app.listen(8080);

Cookie 管理

咱俩可以使用中间件向 Node.js 服务器发送 cookie
新闻,以下代码输出了客户端发送的 cookie 新闻:

中间件

express_cookie.js 文件代码:

// express_cookie.js
文件 var express = require(‘express’)
var cookieParser = require(‘cookie-parser’)
var app = express() app.use(cookieParser())
app.get(‘/’, function(req, res) { console.log(“Cookies: “, req.cookies) }) app.listen(8081)

执行以上代码:

$ node express_cookie.js 

前些天你可以访问 并查阅终端新闻的出口,如下演示:

亚洲必赢官网 14


概念

连带资料

  • Express官网:
  • Express4.x API:
  • 中间件就是处理HTTP请求的函数,用来形成各个特定的职分,比如检测用户是或不是登录,分析数据,以及其他在需求最终将数据发送给用户此前形成的任务
    * 特点:
    * 1.每个中间件都得以操纵流程是不是继续执行
    * 2.各样中间件的req res都是用的同一个对象
    * 3.即便出错了,转交错误处理中间件进行处理
    * 4.最大的表征是,一个中间件处理完,可以把相应数额再传递给下一个中间件
    * 5.如若调用回调函数的next参数表示将请求数据传递给下一个中间件

例子:

  • //中心发了100快钱
    app.use(function (req,res,next)
    {
        req.money = 100;
        next();
    });
    //市政府
    app.use(function (req,res,next)
    {
        req.money -= 20;
        //假诺next传了一个不为null的参数,表明有错,会暂停其他中间件并履行错误处理中间件
        next(“钱丢了”);
    });
    //村
    app.use(function (req,res,next)
    {
        req.money -= 50;
        next();
    });
    //错误处理中间件
    app.use(function
    (err,req,res,next) {
        console.error(err);
        res.end(err);
    });

    app.all(‘/*’, function(req,res){
        res.send(“”+req.money);
    });

    app.listen(8080);

模板引擎

模板引擎-首先需求先安装才能用
*   nam install ejs
*   1.点名渲染模板引擎
*       app.set(“view engine”,”ejs”);
*   2.安装放模板文件的目录
*       add.set(“views”,path.join(__dirname,”/“));
*   3.rander函数,对网页模板举办渲染,在渲染模板时locals可谓其模板传入变量值,在模板中就可以条用所传变量了
*      
res.rander(view,[local],callback);

前端代码

  • <!DOCTYPE html>
    <html lang=“en”>
    <head>
        <meta charset=“UTF-8”>
        <title>Title</title>
    </head>
    <body>
    姓名:<%=name%><br>
    年龄:<%=age%>
    **
    哪何人的年龄也是:<%=age%>**岁 </body>
    </html>

劳动器端代码

  • app.set(“view
    engine”,”ejs”);
    app.set(“views”,__dirname);//放在当前目录下
    app.get(“/“, function (req,res) {
        //默许模板文件后缀格式是pjs
        res.render(“muban”,{
            name:”tangcaiye”,
            age:18
        });
    });

cookie

安装cookie-parser模块

npm install cookie-parser

代码

  • var express = require(“express”);
    var cookieParser =
    require(“cookie-parser”);

    var app = express();
    app.use(cookieParser());

    app.get(“/“, function (req,res) {
        //即使请求中cookie存在visited,则输出cookie
        //否则,设置cookie字段visited,并设置过期时间
        if (req.cookies.visited){
            res.send(“已走访过”);
        }else {
            res.cookie(“visited”,”1”,{maxAge: 10*60*1000});
            res.send(“第二回访问”);
        }
    });

    app.listen(8080);

参数表达

  • expires:cookie的逾期时间,GMT格式。若是没有点名或者安装为0,则发出新的cookie。
  • maxAge:是设置过去岁月的方便选用,其为过期时间到当下时刻的飞秒值。

api网址:

网站地图xml地图