#####如何使用nodejs和Express框架处理http请求?
参考app.js和routes/index.js的处理过程。
app.js
var routes = require('./routes/index');
...
app.use('/', routes);
routes/index.js
var router = express.Router();
...
router.get('/', function(req, res, next) {
console.log('processing request "/" GET');
res.render('index', {
title: 'Home'
});
});
...
module.exports = router;
可以看出,app.js中使用了routes/index.js模块定义的中间件
拦截处理来自'/'的请求。该中间件为一个Router
对象,定义了处理来自'/'的GET请求的路由
方法。
#####名词解释
//加载处理来自/user的http请求的中间件
app.use('/user', function(req, res, next) {
...
});
中间件Middleware其实是一个函数,它可以访问请求对象req,响应对象res,和下一个中间件next。
中间件的功能包括:
- 执行任何代码。
- 修改请求和响应对象。
- 终结请求-响应循环。
- 调用堆栈中的下一个中间件。
当一个http请求到来时,会依次被中间件拦截处理。如果当前中间件没有终结请求-响应循环,则必须调用next() 方法将控制权交给下一个中间件,否则请求就会挂起。
如下面的例子:来自/user的请求,会经过login中间件处理,再经过doSomething中间件处理。
function login(req, res, next) {
console.log('in login');
next();
}
function doSomething(req, res, next) {
Console.log('in doSomething');
res.send('Hello world');
}
app.use('/user', login);
app.use('/user',doSomething);
相关教程: 中间件
######路由 --- 路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。简单理解就是*能够处理浏览器发过来的请求的函数*。 ```javascript //处理来自/test的http请求(包括get, post, put, head, delete,等等) app.all('/test', function(req, res, next) { ... });
//处理来自/test的GET请求 app.get('/test',function(req, res, next){ ... });
//处理来自/test的POST请求 app.post('/test',function(req, res, next){ ... });
还支持以下方法:

相关教程:
[路由](http://www.expressjs.com.cn/guide/routing.html)
<br>
######Router
---
```javascript
var router = require('express').Router(); //新建一个Router
Router是中间件和路由中一个独立的实例,可以理解为mini app,和app拥有类似的方法。
////加载处理来自/user的http请求的中间件
router.use('/test', fucntion(req, res, next) {
...
}
//处理来自/test的http请求(包括get, post, put, head, delete,等等)
router.all('/test', function(req, res, next) {
...
});
//处理来自/test的GET请求
router.get('/test',function(req, res, next) {
...
});
//处理来自/test的POST请求
router.post('/test',function(req, res, next) {
...
});
app.js
var express = require('express');
var bodyParser = require('body-parser'); //body-parser中间件,用于解析请求体内容
var routes = require('./routes/index');
app.use(bodyParser.urlencoded({ extended: false })); //加载body-parser中间件,解析urlencoded请求体
app.use('/', routes); //加载routes/index.js定义的中间件处理'/'请求
routes/index.js
var express = require('express');
var router = express.Router(); //新建一个Router对象
//处理 '/' GET
router.get('/', function(req, res, next) {
console.log('processing request "/" GET');
//响应 渲染views/index.ejs模版,生成index.html并显示到浏览器中
res.render('index', {
title: 'Home'
});
});
//处理 '/shoes?order=desc&shoe[color]=blue' GET
router.get('/shoes', function(req, res, next) {
console.log('processing request "/shoes" GET -- 1');
var order = req.query.order;
//doSomething
...
//调用下一个处理'/shoes?order=desc&shoe[color]=blue'的路由方法
//这里会调用下面的紧跟着的那个router.get('/shoes', ...);
next();
});
//处理 '/shoes?order=desc&shoe[color]=blue' GET
router.get('/shoes', function(req, res, next) {
console.log('processing request "/shoes" GET -- 2')
//doSomething
...
//重定向
res.redirect('http://google.com');
});
//处理'/login' POST id=wynne pwd=123456
router.post('/login', function(req, res, next) {
console.log('processsing user login request "/login" POST');
var id = req.body.id;
var pwd = req.body.pwd;
//doSomething about login using id and pwd
...
//发送一个'Hello world!'响应
res.send('Hello world!');
}
//可以在这里添加其他的请求处理函数~
//router.get('/xxxx', function(req, res, next){ ... });
//router.post('/xxxx', function(req, res, next){ ... });
//其实还支持链式,路径在一个地方指定,这样做有助于创建模块化的路由,而且减少了代码冗余和拼写错误。
/*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');
});
*/
module.exports = router;