express面试题
1.安装express
npm install express
2.启动express服务器
var express = require('express');
var app = express();
app.listen(80);
3.配置路由
语法:app.方法('路径',回调函数)
例子:
app.get('/',function(req,res){req.send('000')});
app.post('/',function(req,res){req.send('0000')});
4.在路由中应用参数
使用查询字符串,使用POST参数,使用正则表达式,使用定义的参数
使用查询字符串
var express = require('express');
var app = express();
app.post('/find',function(req,res){
var url_parts = url.parse(req.url,true);
var query = url.parse(req.url,true);
res.send('Finding Book:Author:' + query.author + 'Title: ' + query.title);
})
req.url获取路径
url.parse:把路径解析为一个对象
有两个参数,第二个参数为true的时候,把解析的字符串转变成对象,通过query来访问
使用已定义的参数应用回调函数
app.apram('userid',function(req,res,next,value){
console.log("Request with userid: " + value);
next();
});
例如:URL为/user/1009
console.log()语句为Userid:1009
5.参数接收
在express中,接收参数的方式有3种,一种是用路由参数,URL查询字符串参数,body(HTTP请求体)参数
(1)路由参数
router.get('/user/:id',function(req,res,next){
res.send("Get User: " + req.param("id"));
})
路由参数通过req.params
取值。在上面示例中,/user/:id
路由中的:id
参数是一个变量,可以通过req.params.id
接收这个变量的值。
例如,URL是:/user/:0001
res.send()方法返回值是:GET User, 0001
(2)URL查询字符串参数
指url中传递的参数req.query
当我们发送一个GET /user?id=1&name=myName
请求时,接收这个对象使用如下方法:
console.log(req.query); // {id:'1', name:'myName'}
(3)body(HTTP请求体)参数
body参数用req.body对象接收(需要通过body-parser模块处理),body参数指的是HTTP请求中的参数。在HTTP请求方法中,只有POST,GET,PATCH三种方法存在请求体,在其他请求方法中,req.body是一个空对象。
req.body; // 接收HTTP请求体中的参数
6.不同HTTP请求方法中 的参数接收
get,post,put,delete,options,track,connect,head,patch9种请求方法
目的测试express.js对各类HTTP请求的支付情况和各种HTTP请求方式和参数接收情况
(1)定义路由和客户端代码
使用request来实现一个HTTP客户端,客户端中添加:路由参数,URL查询字符串参数和body参数
通过变更options.method参数实现不同方式HTTP请求
var request = require('request');
/**
*请求的URL包含一个query参数和params参数
*请求方法分别使用'get','head','post','put','delete','connect','options','track','patch'
*/
var options = {
url:'https://127.0.0.1:3000/node?q='+encodeURIComponent('IT笔录'),
method: 'GET',
headers:{
'Content-Type':'application/x-www-form-urlencoded'
}
body:'form=itbilu.com'
}
function callback(err,response,body){
if(!error && response.statusCode == 200){
var info = JSON.parse(body);
console.log(info);
}
}
router.all():客户端所有的类型HTTP请求都会发送到这个路由中。
/* 一个处理所有请求的中间件 */
router.all('/:path', function(req, res, next){
// 客户端请求使用的HTTP方法
var method = req.method;
// URL 查询字符串参数
var query = req.query;
// body(HTTP请求体)参数
var body = req.body;
// 路由(路径)参数
var params = req.params;
console.log(method);
console.log('query:', query);
console.log('body:', body);
console.log('params:', params);
next();
});
(2)HTTP请求的接收
下面是HTTP客户端发送不同类型HTTP请求后,express应用对各种请求的方式的参数接收情况
GET 请求
GET
query:{ q: 'IT笔录' }
body:{ from: 'itbilu.com' }
params:{ path: 'node' }
GET /node?q=IT%E7%AC%94%E5%BD%95
HEAD请求
HEAD
query:{ q: 'IT笔录' }
body:{}
params:{ path: 'node' }
HEAD /node?q=IT%E7%AC%94%E5%BD%95
HEAD请求时,客户端不能包含body参数,否则会报错
POST请求
POST
query:{ q: 'IT笔录' }
body:{ from: 'itbilu.com' }
params:{ path: 'node' }
POST /node?q=IT%E7%AC%94%E5%BD%95
PUT请求
PUT
query:{ q: 'IT笔录' }
body:{ from: 'itbilu.com' }
params:{ path: 'node' }
PUT /node?q=IT%E7%AC%94%E5%BD%95
DELETE请求
DELETE
query:{ q: 'IT笔录' }
body:{ from: 'itbilu.com' }
params:{ path: 'node' }
DELETE /node?q=IT%E7%AC%94%E5%BD%95
CONNECT请求
// 无返回,request模块不支付
OPTIONS请求
OPTIONS
query:{ q: 'IT笔录' }
body: { from: 'itbilu.com' }
params:{ path: 'node' }
OPTIONS /node?q=IT%E7%AC%94%E5%BD%95
TRACE请求
TRACE
query:{ q: 'IT笔录' }
body:{ from: 'itbilu.com' }
params:{ path: 'node' }
TRACE /node?q=IT%E7%AC%94%E5%BD%95
PATCH请求
PATCH
query:{ q: 'IT笔录' }
body:{ from: 'itbilu.com' }
params:{ path: 'node' }
PATCH /node?q=IT%E7%AC%94%E5%BD%95
总结:
经过上面的测试我们可以得出以下结论:
Experss
与HTTP标准不尽一致,除HEAD
、CONNECT
请求方法外,其它请求方式均支付三种参数接收方式。Express
在处理各类HTTP请求时没有严格按HTTP标准执行,在HTTP
标准中只有POST
、PUT
、PATCH
三种请求方式中存在HTTP请求体(即:body
参数),但在Express
及其中间件解析时,除HEAD
方法外并没有区分body
参数- 除不被支持的
CONNECT
方法外,其它所有接收方式均支付URL查询字符串参数
和路由参数。
在使用Express应用和Express路由及中间件时,建议按HTTP标准进行处理和参数传递。尤其是body
参数,在标准中只有POST
、PUT
、PATCH
三种方式可以传递body HTTP请求体
,除这三种方式外,建议不要使用req.body
方法。
Express.js 应用-路由定义和不同HTTP请求方式传递参数的接收 - IT笔录