Skip to content

Instantly share code, notes, and snippets.

@winnchen
Last active November 5, 2015 10:01
Show Gist options
  • Save winnchen/906c3e9ed04abdb967fa to your computer and use it in GitHub Desktop.
Save winnchen/906c3e9ed04abdb967fa to your computer and use it in GitHub Desktop.

#####如何使用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请求的路由方法。


#####名词解释

######中间件Middleware

//加载处理来自/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://7xlmni.com1.z0.glb.clouddn.com/A.png)

相关教程:
[路由](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;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment